2

私は見えます

#ifdef <token>
code;
#endif

含まれていますが、含まれているヘッダーのいずれにも定義されていません。トークンを定義できる他のメカニズムはありますか?

4

3 に答える 3

4

まず、コンパイラによって暗黙的に定義されるマクロがあります(たとえば__cplusplus)。これらのいくつかは標準であり、いくつかはコンパイラ固有の拡張機能です。完全なリストについては、コンパイラのマニュアルを参照してください。

さらに、ほとんどのコンパイラでは、コマンドラインでマクロを定義できます。正確なメカニズムはコンパイラに依存しますが、多くの場合、-Dまたは/Dコマンドラインオプションの形式を取ります。たとえば、gccマニュアルを参照してください。

-D name

定義1を使用して、名前をマクロとして事前定義します。

-D name=definition

定義の内容はトークン化され、変換フェーズ3で`#define'ディレクティブに表示されたかのように処理されます。特に、定義は埋め込まれた改行文字によって切り捨てられます。シェルまたはシェルのようなプログラムからプリプロセッサを呼び出す場合は、シェルの引用符構文を使用して、シェル構文で意味を持つスペースなどの文字を保護する必要がある場合があります。

コマンドラインで関数のようなマクロを定義する場合は、等号(存在する場合)の前に括弧を付けて引数リストを記述します。括弧はほとんどのシェルにとって意味があるため、オプションを引用する必要があります。shとcshでは、-D'name(args ...)=definition'が機能します。

Microsoft Visual C ++については、 http://msdn.microsoft.com/en-us/library/hhzbb5c8( v = vs.80 ).aspxを参照してください。

一部のコンパイラは、特定のプリプロセッサマクロが定義されている場所を特定するための便利なツールを提供します。たとえば、指定されたマクロ/プリプロセッサシンボルが宣言されたときに(GCCで)知る方法を参照してください。

于 2012-11-05T20:47:02.153 に答える
2

ほとんどの(すべて?)コンパイラでは、フラグ(gccでは-D)を使用して値を定義できます。また、コンパイラ自体によって設定されるものもあります。

于 2012-11-05T20:47:31.170 に答える
1

はい、もちろん、プリプロセッサディレクティブはコンパイラで設定できます。たとえば、gccを使用すると、コマンドラインにディレクティブを追加したり、VisualStudioのプロジェクト設定でディレクティブを指定したりできます。__cplusplus、、または_LINE_についても考えて_FILE_ください。それらはどこにも定義されていませんが、存在しています。また_DEBUG、またはUNICODEMSVS環境によって設定されます。

于 2012-11-05T20:46:43.197 に答える