#if、#elif、#else 和 #endif 指示詞

控制原始程式檔部分編譯的預處理器指示詞。

#if ifCondition ...
[#elif elifCondition ...]
[#else ...]
#endif

參數

項目 描述
ifCondition
要評估的主要條件。 如果此參數評估為非零值,這個#if指示詞與下一個#elif、#else或#endif 指示詞實例之間的所有文字都會保留在轉譯單位中;否則,不會保留後續的原始程式碼。
條件可以使用定義的預處理器運算子來判斷是否已定義特定的預處理器常數或宏;這個用法相當於 使用 #ifdef 指示詞。
如需 ifCondition 參數值的限制,請參閱一節。
elifCondition [選擇性]
要評估的其他條件。 如果 ifCondition 參數和所有先前的 #elif 指示詞都評估為零,且此參數評估為非零值,則這個#elif 指示詞與下一個 #elif、#else 或 #endif 指示詞實例之間的所有文字都會保留在轉譯單位中;否則,不會保留後續的原始程式碼。
條件可以使用定義的預處理器運算子來判斷是否已定義特定的預處理器常數或宏;這個用法相當於 使用 #ifdef 指示詞。
如需 elifCondition 參數值的限制,請參閱一節。

備註

原始程式檔中的每個#if指示詞都必須與結尾#endif指示詞相符。 #if 和 #endif 指示詞之間可以出現任意數目的#elif指示詞,但最多允許一個#else指示詞。 如果存在,則#else指示詞必須是#endif前的最後一個指示詞。 Include 檔案中包含的條件式編譯指示詞必須滿足相同的條件。

#if、#elif、#else和#endif指示詞可以在其他#if指示詞的文字部分中巢狀。 每個巢狀#else、#elif或#endif指示詞都屬於最接近的先前#if指示詞。

如果沒有條件評估為非零值,預處理器會在 #else 指示詞之後選取文字區塊。 如果省略 #else 子句,且沒有任何條件評估為非零值,則不會選取任何文字區塊。

ifConditionelifCondition參數非常符合下列需求:

  • 條件式編譯運算式會被視為 帶正負號的長 值,而且這些運算式會使用與 C++ 中的運算式相同的規則進行評估。
  • 運算式必須是整數類型,而且只能包含整數常數、字元常數和 defined 運算子。
  • 運算式無法使用 sizeof 或類型轉換運算子。
  • 目標環境可能無法表示所有範圍的整數。
  • 轉譯代表與long類型相同的類型int而 unsigned intunsigned long相同。
  • 轉譯器可以將字元常數轉譯為一組與目標環境的一組程式碼值不同的程式碼值。 若要判斷目標環境的屬性,請於針對目標環境建置之應用程式的 LIMITS.H 中檢查巨集的值。
  • 運算式不得執行任何環境查詢,並且必須與目標電腦上的實作詳細資料保持隔離。

範例

本節包含示範如何使用條件式編譯預處理器指示詞的範例。

使用定義的運算子

下列範例示範如何使用定義的 運算子。 如果定義識別碼 CREDIT,則會編譯 對 credit 函式的呼叫。 如果定義識別碼 DEBIT,則會編譯 對轉帳 函數的呼叫。 如果未定義任何識別碼,則會編譯 對 printerror 函 式的呼叫。 請注意,「CREDIT」 和 「credit」 是 C 和 C++ 中的相異識別碼,因為它們的案例不同。

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

使用巢狀#if指示詞

下列範例示範如何巢狀#if指示詞。 此範例假設先前已定義名為 DLEVEL 的符號常數。 #elif 和 #else 指示詞可用來根據 DLEVEL 的值,做出四個選項之一。 根據 DLEVEL 的定義,常數 STACK 會設定為 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++ 中,類別通常會定義于標頭檔中,條件式編譯建構可用來防止多個定義。 下列範例會判斷是否已定義符號常數EXAMPLE_H。 如果是,則表示檔案已經包含,而且不需要重新處理;如果不是,則會定義常數EXAMPLE_H來指出 EXAMPLE。H 已經處理過。

#if !defined( EXAMPLE_H )
#define EXAMPLE_H

class Example
{
...
};

#endif // !defined( EXAMPLE_H )

另請參閱

DirectX HLSL (預處理器指示詞)