web-dev-qa-db-ja.com

vc ++でbison&flexプログラムをコンパイルする際のunistd.h関連の問題

私はvc ++でbison&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

フレックスファイル(.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

この問題を解決するにはどうすればよいですか?

これらのエラーはすべて、フレックスで生成されたスキャナーで発生します。

nistd.hがWindowsに存在しないためだとわかります。独自のunistd.hを作成する必要がありますか?その場合、これらのエラーを排除するためにどのように作成しますか?

24
Haiyang

isattyは、入力ストリームがターミナルであるかパイプ/ファイルであるかを判別するためにレクサーによって使用されます。レクサーはこの情報を使用してキャッシュ動作を変更します(レクサーは、端末でない場合に入力の大きなチャンクを読み取ります)。プログラムがインタラクティブな種類で使用されることがないことがわかっている場合は、レクサーに%option never-interactiveを追加できます。ユーザー入力でプログラムを実行する場合は、%option interactiveを使用してください。両方の用途が必要な場合は、バッチモードで使用するとパフォーマンスが低下するインタラクティブなレクサーを生成するか、独自のisatty関数を提供できます。

17
Rudi

%option nounistdファイルで.lを使用して、unistd.hへの依存を削除します。

15
Dr. Alex RE

誰かがまだこの問題を抱えている場合に備えて、Flexのdevelファイルにはunistd.hが付属しています。これはここで見つかりました:

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

簡単に言うと、コンパイラが到達できることを確認してください。私の場合は、追加のインクルージョンディレクトリに「C:\ GnuWin32\include」を追加するだけです。

9
flyontheweb

オプション--wincompatを指定してwin_flex.exeを使用すると、Lexファイルをハッキングする必要がありません。

7

unistd.hはUNIXヘッダーであるため、VC++には存在しません。最善の策は、Cygwin(またはmingw/msys)でg ++を使用してコンパイルすることです。他の提案については、 この質問 も参照してください。

2
tzaman

YY_NO_UNISTD_HをチェックしないGnuWin32プロジェクトからのflex2.5.4を使用しています。

私のバージョンでは、FlexはC++としてコンパイルされている場合にのみunistd.hを検索するため、yylvalがC++構造を使用しない場合は、この問題をすべて回避できます。

STLをyylvalで使用する必要があったので(ポインターを使用してPOD型にする)、C++でflexをコンパイルするために、この単純なunistd.h

#include <io.h>

必要なのはそれだけです(実際には、flyontheweb suggests のように、GnuWin32に付属のunistd.hファイルをコピーできます)。

P.S.まとめ:Bisonでは、yylvalに必要なSTLヘッダーファイルを%code requires {}に配置し、現在のディレクトリをmakefileのINCLUDEパスに追加しました。

1
Yariv

私は手遅れですが、とにかく私はまだ答えを探している誰かを救うために私の発見を共有します。私の場合、コンパイラがヘッダーを探す場所に空のunistd.hファイルがあるとうまくいきます。

1
Sacha Nath

この投稿は古いですが、私は同じ問題に直面しており、ここでうまくいくはずです。 WinFlexBison

0
smit