unistd.h编译野牛时的相关困难& vc ++下的flex程序

时间:2010-05-08 08:30:45

标签: visual-c++ cygwin bison flex-lexer

我正在使用野牛和使用vc ++进行flex(通过cygwin下载)。当我编译程序时出现错误:

...: 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

如果我在flex文件(.l)中定义YY_NO_UNISTD_H,则此错误将消失,但我还会收到其他几个错误:

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

如何解决此问题?

所有这些错误都发生在flex生成的扫描仪中。

我知道这是因为windows中不存在unistd.h。我是否必须编写自己的unistd.h?如果是这样,如何编写它以消除这些错误?

8 个答案:

答案 0 :(得分:15)

词法分析器使用

isatty来确定输入流是终端还是管道/文件。词法分析器使用此信息来更改其缓存行为(词法分析器在不是终端时读取大块输入)。如果您知道您的程序永远不会以交互式方式使用,则可以将%option never-interactive添加到词法分析器中。使用用户输入运行程序时,请使用%option interactive。如果需要两种用途,您可以生成交互式词法分析器,在批处理模式下使用会导致性能下降,或者提供您自己的isatty功能。

答案 1 :(得分:14)

使用%option nounistd文件中的.l消除对unistd.h的依赖。

答案 2 :(得分:9)

以防有人仍然存在这个问题, Flex在其开发文件中附带unistd.h。我在这里找到了这个:

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

简而言之,只需确保您的编译器可以访问它。在我的情况下,它只是将“C:\ GnuWin32 \ include”添加到其他包含目录

答案 3 :(得分:5)

使用带有-wincompat选项的win_flex.exe,你不需要破解你的lex文件

答案 4 :(得分:2)

unistd.h是一个UNIX标头,所以它在VC ++中不存在;你最好的选择可能是在Cygwin(或mingw / msys)中使用g ++编译它。您还可以查看this question以获取其他建议。

答案 5 :(得分:1)

我正在使用来自GnuWin32项目的flex 2.5.4,该项目不会检查YY_NO_UNISTD_H

在我的版本中,Flex仅在编译为C ++时才查找unistd.h,因此如果yylval不使用任何C ++构造,则可以省去所有这些麻烦。

我必须在yylval中使用STL(使用指针使其成为POD类型),所以为了在C ++中进行flex编译,我创建了这个简单的 unistd.h

#include <io.h>

这就是所需要的(实际上,我可以复制gnuWin32附带的unistd.h文件,例如flyontheweb suggests)。

P.S。为了总结:在Bison中,我将yylval所需的STL头文件放在%code requires {}中,并将当前目录添加到我的makefile中的INCLUDE路径中。

答案 6 :(得分:0)

我来不及但是无论如何我会分享我的发现以拯救仍在寻找答案的人。 在我的情况下,在编译器查找标题的位置有一个空的unistd.h文件。

答案 7 :(得分:0)

这篇文章很老但是我面临同样的问题,这里应该有用。 WinFlexBison