запустите.h связанные с этим трудности при компиляции программы bison & flex под vc++


Я использую bison & flex (загруженный через cygwin) с vc++. При компиляции программы я получил ошибку:

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

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

#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's 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.ч? Если да, то как написать его, чтобы устранить эти ошибки?

8 17

8 ответов:

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

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

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

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

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

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

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

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

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

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

#include <io.h>

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

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

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

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