私は見えます
#ifdef <token>
code;
#endif
含まれていますが、含まれているヘッダーのいずれにも定義されていません。トークンを定義できる他のメカニズムはありますか?
私は見えます
#ifdef <token>
code;
#endif
含まれていますが、含まれているヘッダーのいずれにも定義されていません。トークンを定義できる他のメカニズムはありますか?
まず、コンパイラによって暗黙的に定義されるマクロがあります(たとえば__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で)知る方法を参照してください。
ほとんどの(すべて?)コンパイラでは、フラグ(gccでは-D)を使用して値を定義できます。また、コンパイラ自体によって設定されるものもあります。
はい、もちろん、プリプロセッサディレクティブはコンパイラで設定できます。たとえば、gccを使用すると、コマンドラインにディレクティブを追加したり、VisualStudioのプロジェクト設定でディレクティブを指定したりできます。__cplusplus
、、または_LINE_
についても考えて_FILE_
ください。それらはどこにも定義されていませんが、存在しています。また_DEBUG
、またはUNICODE
MSVS環境によって設定されます。