#if、 #elif、 #else と #endif のディレクティブ (C/C++)
#if のディレクティブは#elif と#else と #endif のディレクティブソース ファイルの一部のコンパイルを制御します。() の後 #if 持つ式がゼロ以外の値は翻訳単位で#if のディレクティブの後の行グループ保持されます。
文法
の条件 :
一部の optoptelif partselse 行 partendif: パーツ
行のテキスト行 :
の 定数式 #if#ifdef ID
#ifndef ID
一部 elif :
行のテキスト elifelif パーツの行のテキスト elif
行 elif :
の 定数式 #elifなど一部 :
他のテキスト行その行 :
#elseendif 行 :
#endif
ソース ファイルの #if の各ディレクティブには #endif の最後のディレクティブと一致する必要があります。#elif のディレクティブをいくつでも #endif の #if とディレクティブの間に挿入できますが最大で 1 #else の二つのディレクティブが割り当てられます。#else のディレクティブでは#endif の前の最後のディレクティブである必要があります。
#if#elif#else と #endif のディレクティブは #if の他のディレクティブのテキストの部分に入れ子にすることもできます。各は #else#elif になったまたは #endif のディレクティブは #if の最も近い先行するディレクティブに属しています。
すべての条件付きコンパイル ディレクティブは#if と #ifdef のような EOF が見つかりました。#endif の前にディレクティブを終了すると; 一致する必要があります。それ以外の場合はエラー メッセージが生成されます。条件付きコンパイル ディレクティブを追加するとファイルを同じ要件を満たす必要があります。: インクルード ファイルの末尾に " 条件付きコンパイル ディレクティブはありません。
コントロールはマクロ #elif のコマンドにこのマクロはが 定数式 で使用できますがコマンド ラインの一部内で実行されます。
プリプロセッサはさらに処理のテキストの特定が 1 を選択します。 テキスト ブロックはで指定されたテキストのシーケンスです。また複数の行を占めることができます。通常テキスト は プリプロセッサまたはコンパイラが意味を持つプログラム テキストです。
プリプロセッサ選択したテキストを処理しコンパイラに渡します。 テキストが プリプロセッサ ディレクティブが含まれている場合はこれらのプリプロセッサ ディレクティブを実行します。プリプロセッサによって選択されたテキスト ブロックだけがコンパイルされます。
プリプロセッサは #if または #elif の各ディレクティブに続く定数式の評価には(ゼロ) 以外の定数式が見つかるまで一つの テキストの 項目を選択します。これは関連付けられた #elif#elseまたは #endif までのすべてのテキスト (# 以降など他のプリプロセッサ ディレクティブ) を選択します。
定数式 のすべての一致が false であるか#elif のディレクティブが表示されない場合はプリプロセッサは #else の句の後にテキスト ブロックを選択します。#else の句を省略し#if ブロックの 定数式 のすべてのインスタンスが false の場合テキスト ブロックが選択されていません。
定数式は これらの追加の整数定数式です :
式は整数型であり整数定数文字定数と 定義する の演算子のみ含めることができます。
式は sizeof または型にキャスト演算子を使用できません。
対象の環境では整数の範囲を表せます場合があります。
移動は long 型と同じ型 intunsigned long と同じ unsigned int を表します。
変換は一連の対象となる環境ごとの設定とは別のコード値から文字定数ができます。対象の環境のプロパティを確認するにはビルド対象の環境のアプリケーションの LIMITS.H からマクロの値を確認します。
式は環境を照会しターゲット コンピューターの詳細な実装から分離されてある必要があります。
定義する プリプロセッサ演算子の構文は次に示すように特別な定数式で使用できます。:
定義済み (identifier)
定義された identifier
この定数式は 識別子が 現在定義されていると見なされます (以外); それ以外の場合は条件が false です (0)。空のテキストで定義されている識別子が定義されていると見なされます。 定義する のディレクティブは #if と #elif 内のディレクティブも使用できます。
次の例では#if と #endif のディレクティブは3 の機能は 1 回のコンパイルを制御します :
#if defined(CREDIT)
credit();
#elif defined(DEBIT)
debit();
#else
printerror();
#endif
credit 関数への呼び出しは識別子が定義されている場合 CREDIT コンパイルします。識別子 DEBIT が定義されている場合debit 関数への呼び出しはコンパイルされません。どちらの識別子が定義されていない場合printerror の呼び出しはコンパイルされません。ケースが異なるため CREDIT と credit が C および C++ の各識別子であることに注意してください。
次の例では条件付きコンパイル ステートメントはDLEVEL という名前の前に定義された記号定数を前提としています。
#if DLEVEL > 5
#define SIGNAL 1
#if STACKUSE == 1
#define STACK 200
#else
#define STACK 100
#endif
#else
#define SIGNAL 0
#if STACKUSE == 1
#define STACK 100
#else
#define STACK 50
#endif
#endif
#if DLEVEL == 0
#define STACK 0
#elif DLEVEL == 1
#define STACK 100
#elif DLEVEL > 5
display( debugptr );
#else
#define STACK 200
#endif
#if の最初のブロックは 2 セットの入れ子になった #if#else と #endif のディレクティブを示します。ディレクティブの先頭の設定は DLEVEL > 5 が true の場合にのみ処理されます。はステートメントの後の文字 else が処理されます。
2 番目の例の #elif と #else のディレクティブが DLEVEL の値に基づいて4 種類の選択1 を設定するために使用されます。定数 STACK は0100DLEVEL の定義によって 200 に設定します。DLEVEL が 5 より大きい場合ステートメント
#elif DLEVEL > 5
display(debugptr);
コンパイルSTACK は定義されていません。
条件付きコンパイルの一般的な使用方法は複数のヘッダー ファイルのインクルードを防ぐことです。クラスはヘッダー ファイルで定義されている C++ では複数の定義を防ぐには次を使用できるように構造 :
/* EXAMPLE.H - Example header file */
#if !defined( EXAMPLE_H )
#define EXAMPLE_H
class Example
{
...
};
#endif // !defined( EXAMPLE_H )
シンボリック EXAMPLE_H 定数が定義されているかどうかをチェックする前のコードコード。その場合ファイルは既に含まれており再処理する必要はありません。そうでない場合は既に処理済みとして EXAMPLE.H を表示する EXAMPLE_H 定数が定義されます。