說明:這個C語言專題,是學習iOS開發的前奏。也為了讓有面向對象語言開發經驗的程序員,能夠快速上手C語言。如果你還沒有編程經驗,或者對C語言、iOS開發不感興趣,請忽略
上一篇已經介紹了預處理指令中的宏定義,這篇就介紹一下條件編譯
條件編譯的概念
在很多情況下,我們希望程序的其中一部分代碼只有在滿足一定條件時才進行編譯,否則不參與編譯(只有參與編譯的代碼最終才能被執行),這就是條件編譯。
一、基本用法
1 #if 條件1 2 ...code1... 3 #elif 條件2 4 ...code2... 5 #else 6 ...code3... 7 #endif
1> 如果條件1成立,那么編譯器就會把#if 與 #elif之間的code1代碼編譯進去(注意:是編譯進去,不是執行,很平時用的if-else是不一樣的)
2> 如果條件1不成立、條件2成立,那么編譯器就會把#elif 與 #else之間的code2代碼編譯進去
3> 如果條件1、2都不成立,那么編譯器就會把#else 與 #endif之間的code3編譯進去
4> 注意,條件編譯結束后,要在最后面加一個#endif,不然后果很嚴重(自己思考一下后果)
5> #if 和 #elif后面的條件一般是判斷宏定義而不是判斷變量,因為條件編譯是在編譯之前做的判斷,宏定義也是編譯之前定義的,而變量是在運行時才產生的、才有使用的意義
二、舉個例子
1 #include <stdio.h> 2 3 #define MAX 11 4 5 int main () 6 { 7 #if MAX == 0 8 printf("MAX是0"); 9 #elif MAX > 0 10 printf("MAX大於0"); 11 #else 12 printf("MAX小於0"); 13 #endif 14 return 0; 15 }
在第3行定義了一個宏MAX,當然在開發中這個MAX可能被定義在其他頭文件中,現在只是為了方便演示,就寫到main函數上面了。注意第7到第13行的條件編譯語句。
由於MAX為11,所以#elif的條件成立,第10行代碼將會被編譯進去,其實編譯預處理后的代碼是這樣的:
1 /*stdio.h文件中的內容將會代替#include <stdio.h>的位置*/ 2 3 int main () 4 { 5 printf("MAX大於0"); 6 return 0; 7 }
代碼變得非常簡潔,輸出結果:
三、其他用法
1.#if defined()和#if !defined()的用法
#if 和 #elif后面的條件不僅僅可以用來判斷宏的值,還可以判斷是否定義過某個宏。比如:
1 #if defined(MAX) 2 ...code... 3 #endif
如果前面已經定義過MAX這個宏,就將code編譯進去。它不會管MAX的值是多少,只要定義過MAX,條件就成立。
條件也可以取反:
1 #if !defined(MAX) 2 ...code... 3 #endif
如果前面沒有定義過MAX這個宏,就將code編譯進去。
2.#ifdef和#ifndef的使用
* #ifdef的使用和#if defined()的用法基本一致
1 #ifdef MAX 2 ...code... 3 #endif
如果前面已經定義過MAX這個宏,就將code編譯進去。
* #ifndef又和#if !defined()的用法基本一致
1 #ifndef MAX 2 ...code... 3 #endif
如果前面沒有定義過MAX這個宏,就將code編譯進去。
