unistd.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(.л) эта ошибка исчезнет, но я получаю несколько ошибок:
...: 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? Если да, то как его написать, чтобы устранить эти ошибки?
8 ответов
isatty
используется лексером для определения, является ли входной поток терминалом или каналом/файлом. Лексер использует эту информацию для изменения своего поведения кэширования (лексер считывает большие куски входных данных, когда он не является терминалом). Если вы знаете, что ваша программа никогда не будет использоваться в интерактивном виде, вы можете добавить %option never-interactive
вам лексер. Когда программа запускается с пользовательским вводом, используйте %option interactive
. Когда оба использования желательны, вы можете либо создать интерактивный лексер, который дает потери производительности при использовании в пакетном режиме, или предоставить свой собственный .
на всякий случай, если у кого-то все еще эта проблема, Flex поставляется с unistd.h в своих файлах devel. Я нашел вот это:
http://sourceforge.net/tracker/index.php?func=detail&aid=931222&group_id=23617&atid=379173
В общем, просто убедитесь, что ваш компилятор может достичь его. в моем случае это просто добавление "C:\GnuWin32\include" к дополнительным каталогам включения
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 в C++ я создал этот простой unistd.h:
#include <io.h>
это все это занимает (на самом деле, я мог бы скопировать unistd.H файл, который поставляется с GnuWin32, как flyontheweb предполагает).
P.S. Чтобы закончить: в Bison я поместил необходимые файлы заголовков STL yylval в %code requires {}
и добавил текущий каталог в пути включения в мой makefile.
Я слишком поздно, но в любом случае я поделюсь своими выводами, чтобы спасти кого-то, кто все еще ищет ответ. В моем случае, имея пустой unistd.H-файл в том месте, где компилятор ищет заголовки работает для меня.
Ну этот пост старый, но я сталкиваюсь с той же проблемой и вот что-то, что должно работать. WinFlexBison