#if、#elif、#else、#endif(C++)
条件コンパイルの概要:インデックス への移動
構文
#if constant-expression-1 <section-1> <#elif constant-expression-2 newline section-2> . . . <#elif constant-expression-n newline section-n> <#else <newline> final-section> #endif
説明
コンパイラでは、該当するソースコード行を空白行に置き換えることで、条件コンパイルをサポートしています。したがって、無視される行は、指令の結果としてコンパイルされなくなる行です。すべての条件コンパイル指令は、1 つのソース ファイルまたはインクルード ファイル内で完結していることが必要です。
条件指令 #if、#elif、#else、および #endif は、通常の C の条件演算子と同じように機能します。定数式 1(マクロ展開の対象)の評価がゼロ以外(true)である場合、セクション 1 で表されるコード行(空の場合もある、プリプロセッサのコマンド ラインあるいは通常のソース行)はプリプロセスされ、適切にコンパイラに渡されます。一方、定数式 1 の評価がゼロ(false)である場合は、セクション 1 は無視されます(マクロ展開とコンパイルはなし)。
値が true の場合、セクション 1 がプリプロセスされた後、制御は対応する #endif(条件コンパイル範囲の終り)に移り、その後の行の処理が続けられます。false の場合、制御は次の #elif 行(存在する場合)に移り、定数式 2 が評価されます。その値が true であれば、セクション 2 が処理され、制御は対応する #endif に移動します。一方、定数式 2 が false の場合は、#else や #endif に達するまで、次の #elif に制御が移ります。#else は必須ではありません。ここまでのすべてのテストが false であった場合に最後の選択肢として使われます。条件コンパイルの範囲は #endif までです。
処理セクションには、任意の深さにネストされた条件句も含むことができます。ただしそれぞれの #if が、適切な #endif と対になる必要があります。
ここまで説明した条件コンパイルの最終結果は、1 つのセクション(空の場合もある)だけが、さらに処理を行うために渡されるということです。無視されたセクションは、条件節のネストを把握するための意味だけがあります。これによりそれぞれの #if が正しい #endif と対応づけられます。
テストされる定数式は、評価結果が定数整数値になることが必要です。