一部の Bison コードでは、次の行は何を意味していますか?
#define YY_DECL extern "C" int yylex();
コマンドは知っ#define
ていますが、コマンド全体を理解していません。
YY_DECL
に展開されるということです。
extern "C" int yylex();
これは実際には C++ であり、C ではありません。このファイルを C++ コンパイラでyylex
コンパイルすると、C 関数が問題なく呼び出すことができるように、関数を「C リンケージ」でコンパイルする必要があることが宣言されます。
C++ でプログラミングしない場合、これはほとんど関係ありませんが、C++ との互換性を維持しようとするライブラリの C ヘッダー ファイルで同様の宣言に遭遇する可能性があります。C と C++ は 1 つのプログラムに混在させることができますが、関数をうまく連携させるにはそのような宣言が必要です。
おそらく#ifdef __cplusplus
この周りに#define
;があります。これは、C++ コンパイラによるコンパイルを示すために使用される特別なマクロです。
#define YY_DECL extern "C" int yylex();
YY_DECL
C++ プログラム内で 'C' リンケージを持つ関数の宣言を表すマクロを定義し、yylex
引数を取らず、int
.
#define
- プリプロセッサの新しい変数を宣言するプリプロセッサ ディレクティブ。しかし、あなたはそれを知っています。
YY_DECL
- 変数の名前。
extern "C"
- 次のコードが純粋な C であることをコンパイラに伝えます。C と C++ の間には多くの違いがあり、通常、C と C++ のコードを混在させることはできません。これを宣言に含めると、C++ で C を使用できるようになります。編集: コードは実際には純粋な C である必要はありませんが、そのようにリンクされます。しかし、最も一般的な使用パターンは、C コードを C++ と互換性のあるものにすることです。修正してくれた@larsmansに感謝します。
int yylex()
yylex
-パラメータの数と戻り値の型が定義されていない名前の関数の宣言int
したがって、コマンド全体で C 関数宣言がプリプロセッサ変数に割り当てられます。