#if、#elif、#else、#endif(C++)

提供: Appmethod Topics
移動先: 案内検索

条件コンパイルの概要:インデックス への移動


構文

#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 と対応づけられます。

テストされる定数式は、評価結果が定数整数値になることが必要です。

関連項目