#if、 # elif、 # else、および # endif ディレクティブ

ソースファイルの一部のコンパイルを制御するプリプロセッサディレクティブ。

#Ifcondition ...
[#elif elifCondition ...]
[#その他...]
#endif

パラメーター

項目 説明
ifCondition
評価するプライマリ条件。 このパラメーターが0以外の値に評価される場合、この # if ディレクティブと、elif、else、または endif ディレクティブの次のインスタンスの間にあるすべてのテキスト # # # が翻訳単位に保持されます。それ以外の場合は、後続のソースコードは保持されません。
条件では、特定のプリプロセッサ定数またはマクロが定義されているかどうかを判断するために定義されたプリプロセッサ演算子を使用できます。この使用法は、 # ifdefディレクティブを使用することと同じです。
Ifcondition パラメーターの値に関する制限については、「解説」を参照してください。
elifCondition [optional]
評価するその他の条件。 Ifcondition パラメーターと前のすべての # elif ディレクティブが0に評価され、このパラメーターが0以外の値に評価される場合、この # elif ディレクティブと次のインスタンス ( # elif、else、または endif ディレクティブ) の間のすべてのテキスト # # が翻訳単位に保持されます。それ以外の場合、後続のソースコードは保持されません。
条件では、特定のプリプロセッサ定数またはマクロが定義されているかどうかを判断するために定義されたプリプロセッサ演算子を使用できます。この使用法は、 # ifdefディレクティブを使用することと同じです。
ElifCondition パラメーターの値に関する制限については、「解説」を参照してください。

Remarks

#ソースファイル内の各 if ディレクティブは、終わり endif ディレクティブで一致する必要があり # ます。 If ディレクティブと endif ディレクティブの間には、任意の数の # elif ディレクティブを # 指定でき # ますが、1つの # else ディレクティブしか使用できません。 #Else ディレクティブ (存在する場合) は、endif の前の最後のディレクティブである必要があり # ます。 インクルードファイルに含まれる条件付きコンパイルディレクティブは、同じ条件を満たしている必要があります。

#If、 # elif、 # else、および endif ディレクティブは、 # 他の if ディレクティブのテキスト部分で入れ子にすることができ # ます。 入れ子になっ # た else、 # elif、または endif ディレクティブはそれぞれ、 # 直前の if ディレクティブに属し # ます。

0以外の値に評価される条件がない場合、プリプロセッサは else ディレクティブの後にテキストブロックを選択し # ます。 #Else 句が省略され、0以外の値に評価される条件がない場合、テキストブロックは選択されません。

Ifcondition パラメーターと elifCondition パラメーターは、次の要件を満たしています。

  • 条件付きコンパイル式は、 符号付き long 値として扱われます。これらの式は、C++ の式と同じ規則を使用して評価されます。
  • 式は、整数型である必要があり、整数定数、文字定数、defined 演算子のみ含めることができます。
  • 式で sizeof または型キャスト演算子を使用することはできません。
  • ターゲット環境は整数のすべての範囲を表現できるとは限りません。
  • この変換は、 int 型と同じ long 型を表し、 unsigned intunsigned long と同じです。
  • トランスレーターは、ターゲット環境とは別のコード値のセットに文字定数を翻訳できます。 ターゲット環境のプロパティを調べるには、ターゲット環境向けにビルドされたアプリケーションで LIMITS.H からマクロの値を確認します。
  • この式は、環境に関する照会を実行できないように、ターゲット コンピューターの実装の詳細から分離しておく必要があります。

このセクションには、条件付きコンパイルプリプロセッサディレクティブの使用方法を示す例が含まれています。

定義された演算子の使用

定義された演算子の使用例を次に示します。 識別子のクレジットが定義されている場合は、 クレジット 関数の呼び出しがコンパイルされます。 識別子の借方が定義されている場合は、 デビット 関数の呼び出しがコンパイルされます。 どちらの識別子も定義されていない場合は、 printerror 関数の呼び出しがコンパイルされます。 "クレジット" と "クレジット" は、C と C++ の異なる識別子であり、そのケースは異なっていることに注意してください。

#if defined(CREDIT)
    credit();
#elif defined(DEBIT)
    debit();
#else
    printerror();
#endif

入れ子になっ # た if ディレクティブの使用

If ディレクティブを入れ子にする方法を次の例に示し # ます。 この例では、DLEVEL という名前のシンボル定数が既に定義されていることを前提としています。 #Elif ディレクティブと # else ディレクティブは、dlevel の値に基づいて4つの選択肢のいずれかを作成するために使用されます。 定数スタックは、DLEVEL の定義に応じて、0、100、または200に設定されます。 DLEVEL が5より大きい場合、STACK は定義されません。

#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

ヘッダーファイルのインクルードに使用する

条件付きコンパイルの一般的な用途は、同じヘッダー ファイルの多重インクルードを防ぐことです。 C++ では、多くの場合、クラスがヘッダーファイルで定義されているため、条件付きコンパイルの構造を使用して複数の定義を防ぐことができます。 次の例では、シンボリック定数の例 H が定義されているかどうかを判断し _ ます。 その場合、ファイルは既に含まれており、再処理する必要はありません。それ以外の場合は、 _ その例を示すために定数の例 H が定義されています。H は既に処理されています。

#if !defined( EXAMPLE_H )
#define EXAMPLE_H

class Example
{
...
};

#endif // !defined( EXAMPLE_H )

関連項目

プリプロセッサディレクティブ (DirectX HLSL)