在不少狀況下,咱們但願程序的其中一部分代碼只有在知足必定條件時才進行編譯,不然不參與編譯(只有參與編譯的代碼最終才能被執行),這就是條件編譯。函數
#if 條件1 ...code1... #elif 條件2 ...code2... #else ...code3... #endif
1> 若是條件1成立,那麼編譯器就會把#if 與 #elif之間的code1代碼編譯進去(注意:是編譯進去,不是執行,很平時用的if-else是不同的)
2> 若是條件1不成立、條件2成立,那麼編譯器就會把#elif 與 #else之間的code2代碼編譯進去
spa
3> 若是條件一、2都不成立,那麼編譯器就會把#else 與 #endif之間的code3編譯進去code
4> 注意,條件編譯結束後,要在最後面加一個#endif,否則後果很嚴重(本身思考一下後果)orm
5> #if 和 #elif後面的條件通常是判斷宏定義而不是判斷變量,由於條件編譯是在編譯以前作的判斷,宏定義也是編譯以前定義的,而變量是在運行時才產生的、纔有使用的意義開發
#include <stdio.h> #define MAX 11 int main () { #if MAX == 0 printf("MAX是0"); #elif MAX > 0 printf("MAX大於0"); #else printf("MAX小於0"); #endif return 0; }
在第3行定義了一個宏MAX,固然在開發中這個MAX可能被定義在其餘頭文件中,如今只是爲了方便演示,就寫到main函數上面了。注意第7到第13行的條件編譯語句。
因爲MAX爲11,因此#elif的條件成立,第10行代碼將會被編譯進去,其實編譯預處理後的代碼是這樣的:編譯器
#if 和 #elif後面的條件不單單能夠用來判斷宏的值,還能夠判斷是否認義過某個宏。好比:it
1 #if defined(MAX) 2 ...code... 3 #endif
若是前面已經定義過MAX這個宏,就將code編譯進去。它不會管MAX的值是多少,只要定義過MAX,條件就成立。io
條件也能夠取反:編譯
1 #if !defined(MAX) 2 ...code... 3 #endif
若是前面沒有定義過MAX這個宏,就將code編譯進去。class
* #ifdef的使用和#if defined()的用法基本一致
1 #ifdef MAX 2 ...code... 3 #endif
若是前面已經定義過MAX這個宏,就將code編譯進去。