プリプロセッサーの条件付きコンパイル・ディレクティブ を使用すると、 プリプロセッサーは、ソース・コードのコンパイルの一部を条件付きで抑止します。 これらのディレクティブは、定数式または ID をテストして、 プリプロセッサーがコンパイラーに渡すべきトークン、 およびプリプロセス時に迂回すべきトークンを判別します。 この条件付きディレクティブには、次のものがあります。
プリプロセッサーの条件付きコンパイル・ディレクティブは、下記のいくつかの行に及び ます。
#if、#ifdef、および #ifndef の各ディレクティブのそれぞれに対して、 ゼロまたは複数の #elif ディレクティブ、 ゼロまたは 1 つの #else ディレクティブ、 および一致する 1 つの #endif ディレクティブがあります。 一致するディレクティブは、すべて同じネスト・レベルにあるものと見なします。
条件付きコンパイル・ディレクティブをネストすることができます。 以下のディレクティブでは、最初の #else は、#if ディレクティブに突き合わせられます。
#ifdef MACNAME /* tokens added if MACNAME is defined */ # if TEST <=10 /* tokens added if MACNAME is defined and TEST <= 10 */ # else /* tokens added if MACNAME is defined and TEST > 10 */ # endif #else /* tokens added if MACNAME is not defined */ #endif
各ディレクティブは、その直後のブロックを制御します。 ブロックは、ディレクティブの後の行から始まって、 同じネスト・レベルにある次の条件付きコンパイル・ディレクティブで終了する、すべてのトークンで構成されます。
各ディレクティブは、検出された順序で処理されます。 式の評価がゼロの場合、ディレクティブの後に続くブロックは無視されます。
プリプロセッサー・ディレクティブの後に続くブロックを無視することになっているとき、 条件付きネスト・レベルが判別できるように、そのブロック内のプリプロセッサー・ディレクティブを識別するだけのために、 トークンが検査されます。 ディレクティブの名前以外のトークンは、すべて無視されます。
式が非ゼロとなる最初のブロックのみを処理します。 そのネスト・レベルにある残りのブロックは無視します。 そのネスト・レベルにあるブロックのどれも処理されていなくて、#else ディレクティブがある場合、#else ディレクティブに続くブロックが処理されます。 そのネスト・レベルにあるブロックのどれも処理されていなくて、#else ディレクティブがない場合、ネスト・レベル全体が無視されます。
関連参照