【C語言】16-預處理指令2-條件編譯


說明:這個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編譯進去。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM