# if、 # elif、 其他 # 和 # endif 指示詞 (C/C++)
#if指示詞,以#elif, #else,以及#endif指示詞控制編譯的原始程式檔的部份。 如果您撰寫的運算式 (之後#if) 具有非零的值時,折線圖圖表群組中緊接#if指示詞會保留在轉譯單位中。
文法
條件式 :
如果組件 elif 部分選擇else 部分選擇endif 線條如果組件 :
如果行文字如果行 :
# if 常數運算式# ifdef 識別項
#ifndef 識別項
elif 部分 :
elif 行文字組件的 elif elif 行文字
elif 行 :
# elif 常數運算式else 部分 :
其他行文字其他線條 :
#elseendif 行 :
#endif
每個#if原始程式檔中的指示詞必須會比對由右#endif指示詞。 任何數目的#elif指示詞可以出現在之間#if和#endif指示詞,但最多一個#else指示詞被允許。 #else指示詞,但如果有的話,必須是最後一個指示詞之前#endif。
#if, #elif, #else,以及#endif指示詞可以套疊在其他的文字部分#if指示詞。 每一個巢狀結構#else, #elif,或#endif指示詞屬於最接近的前一個#if指示詞。
所有的條件式編譯指示詞,例如#if和 # ifdef,必須符合右#endif指示詞之前的檔案結尾。 否則,就會產生錯誤訊息。 當條件式編譯指示詞包含在包含檔內時,它們必須符合相同條件: 必須有沒有不符合的條件式編譯指示詞包含檔案的結尾。
命令列後面的部分內執行的巨集取代#elif指令,因此可用於巨集呼叫常數運算式。
前置處理器會選取其中一個指定次數文字供進一步處理。 在指定的區塊文字可以是任意順序的文字。 它可佔據一個以上的列。 通常是文字是有意義的編譯器或前置處理器的程式文字。
前置處理器處理所選文字 ,並將它傳遞給編譯器。 如果文字包含前置處理器指示詞,這些指示詞前置處理器執行。 只有文字區塊,選取 [前置處理器會編譯。
前置處理器選取單一個文字來評估每個常數運算式的項目#if或#elif指示詞,直到找到,則為 true (非零) 的常數運算式。 它會選取所有文字 (包括其他開頭的前置處理器指示詞 #) 到其相關#elif, #else,或#endif。
如果所有的項目常數運算式都為 false,或者如果沒有#elif指示詞出現、 前置處理器會選取文字區塊之後, #else子句。 如果#else省略子句及其所有實例常數運算式在#if區塊,則為 false,已選取 [沒有文字區塊。
常數運算式是一個整數常數運算式,使用這些額外限制:
運算式必須有整數類資料型別,而且可以包含只有整數常數,字元常數和定義運算子。
運算式不能使用sizeof或型別轉換運算子。
目標環境可能無法表示所有範圍的整數。
轉譯表示型別int型別相同長,和unsigned int與unsigned long。
轉譯程式可以翻譯成一組程式碼值從目標環境的一組不同的字元常數。 若要判斷目標環境的內容,請檢查巨集從限制的值。H 中建置的目標環境的應用程式。
運算式不能執行環境的詢問,必須保持隔離與目標電腦上的實作細節。
前置處理器的運算子定義可以用於特殊的常數運算式,如下列語法所示:
defined( identifier )
已定義identifier
這個常數的運算式會被視為 true (非零),是否識別項目前已定義; 否則,條件為 false (0)。 定義為空的文字會被視為識別項定義。 定義指示詞可以用於#if和#elif指示詞,但沒地方可繼續。
在下列範例中, #if和#endif指示詞控制編譯的三個函式呼叫其中一項:
#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區塊會顯示兩組的巢狀#if, #else,以及#endif指示詞。 處理指示詞的第一組時,才DLEVEL > 5為 true。 否則,# 之後的陳述式其他的處理。
#elif和#else在第二個範例中的指示詞可以用來幫它建一個四個選擇,根據值DLEVEL。 常數STACK設定為 0、 100 或 200,根據定義的DLEVEL。 如果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定義成將範例的標記。如上文處理 H。