#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指示詞。 任何數目的#elif指示詞都可以出現在#if和#endif指示詞之間,但最多允許一個#else指示詞。 如果存在,#else 指示詞必須是#endif前的最後一個指示詞。 包含檔案中包含的條件式編譯指示詞必須滿足相同的條件。
#if、#elif、#else和#endif指示詞可以在其他#if指示詞的文字部分中巢狀。 每個巢狀#else、#elif或#endif指示詞都屬於最接近的上述#if指示詞。
如果沒有條件評估為非零值,預處理器會在#else指示詞之後選取文字區塊。 如果省略#else子句,且沒有條件評估為非零值,則不會選取任何文字區塊。
ifCondition和elifCondition參數非常符合下列需求:
- 條件式編譯運算式會被視為 帶正負號的長 值,而且這些運算式會使用與 C++ 中的運算式相同的規則進行評估。
- 運算式必須是整數類型,而且只能包含整數常數、字元常數和 defined 運算子。
- 運算式無法使用 sizeof 或類型轉換運算子。
- 目標環境可能無法表示所有範圍的整數。
- 轉譯代表與long類型相同的類型int,而 unsigned int與unsigned long相同。
- 轉譯器可以將字元常數轉譯為一組與目標環境的一組程式碼值不同的程式碼值。 若要判斷目標環境的屬性,請於針對目標環境建置之應用程式的 LIMITS.H 中檢查巨集的值。
- 運算式不得執行任何環境查詢,並且必須與目標電腦上的實作詳細資料保持隔離。
範例
本節包含示範如何使用條件式編譯預處理器指示詞的範例。
使用定義的運算子
下列範例顯示已定義運算子的使用。 如果已定義識別碼 CREDIT, 則會編譯對點 數函式的呼叫。 如果已定義識別碼 DEBIT,則會編譯 對轉帳 函式的呼叫。 如果未定義任何識別碼,則會編譯 印表機函 式的呼叫。 請注意,「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 )