Подтвердить что ты не робот

Связанная с unistd.h сложность при компиляции программы bison & flex под vС++

Я использую bison и flex (скачанный через cygwin) с vС++. Когда я скомпилирую программу, я получил сообщение об ошибке:

...: fatal error C1083: Cannot open include file: 'unistd.h': No such file or directory

Соответствующий код в сгенерированном сгибаемом файле:

#ifndef YY_NO_UNISTD_H
/* Special case for "unistd.h", since it is non-ANSI. We include it way
 * down here because we want the user section 1 to have been scanned first.
 * The user has a chance to override it with an option.
 */
/* %if-c-only */
#include <unistd.h>
/* %endif */
/* %if-c++-only */
/* %endif */
#endif

Если я определяю YY_NO_UNISTD_H в файле flex (.l), эта ошибка исчезнет, ​​но я получу еще несколько ошибок:

...: error C2447: '{' : missing function header (old-style formal list?)
...: warning C4018: '<' : signed/unsigned mismatch
...: error C3861: 'isatty': identifier not found

Как я могу исправить эту проблему?

Все эти ошибки возникают в сканере Flex.

Я знаю это, потому что unistd.h не существует в Windows. Должен ли я написать свой собственный unistd.h? Если да, то как это записать, чтобы устранить эти ошибки?

4b9b3361

Ответ 1

isatty используется лексером для определения, является ли входной поток терминалом или каналом/файлом. Лексер использует эту информацию для изменения своего поведения кэширования (лексер читает большие куски ввода, когда он не является терминалом). Если вы знаете, что ваша программа никогда не будет использоваться в интерактивном режиме, вы можете добавить %option never-interactive к лексиру. Когда программа запускается с пользовательским вводом, используйте %option interactive. Когда оба использования желательны, вы можете генерировать интерактивный лексер, который дает потерю производительности при использовании в пакетном режиме или предоставляет собственную функцию isatty.

Ответ 2

Используйте %option nounistd в вашем файле .l, чтобы удалить зависимость от unistd.h.

Ответ 3

на всякий случай кто-то еще эта проблема, Flex поставляется с unistd.h в своих файлах разработки. Я нашел это здесь:

http://sourceforge.net/tracker/index.php?func=detail&aid=931222&group_id=23617&atid=379173

чтобы сократить его, просто убедитесь, что ваш компилятор может его достичь. в моем случае это просто добавление "C:\GnuWin32\include" в дополнительные каталоги включения

Ответ 4

используйте win_flex.exe с опцией --wincompat, и вам не нужно взломать файл lex

Ответ 5

unistd.h - это заголовок UNIX, поэтому он не присутствует в VС++; вам лучше всего скомпилировать его с помощью g++ в Cygwin (или mingw/msys). Вы также можете посмотреть этот вопрос для других предложений.

Ответ 6

Я использую flex 2.5.4, который поступает из проекта GnuWin32, который не проверяет YY_NO_UNISTD_H.

В моей версии Flex ищет unistd.h только при компиляции С++, поэтому вы можете сэкономить все эти проблемы, если ваш yylval не использует никаких конструкций С++.

Мне пришлось использовать STL в yylval (используя указатель, чтобы сделать его POD-типом), поэтому, чтобы сделать компиляцию flex на С++, я создал этот простой unistd.h:

#include <io.h>

Это все, что требуется (на самом деле, я мог бы скопировать файл unistd.h, который поставляется вместе с GnuWin32, например, flyontheweb предлагает).

P.S. Чтобы обернуть вещи: в Bison я поместил yylval в заголовочные файлы STL в %code requires {} и добавил текущий каталог в пути INCLUDE в моем make файле.

Ответ 7

Я слишком поздно, но в любом случае я поделюсь своими выводами, чтобы спасти кого-то, все еще ищущего ответ. В моем случае для меня работает пустой файл unistd.h в месте, где компилятор ищет заголовки.

Ответ 8

Ну, этот пост старый, но я сталкиваюсь с той же проблемой, и вот что-то должно сработать. WinFlexBison