本文目錄
- [條件編譯的概念](http://www.cnblogs.com/mjios/archive/2013/03/20/2971275.html#label0)
- [一、基本用法](http://www.cnblogs.com/mjios/archive/2013/03/20/2971275.html#label1)
- [二、舉個例子](http://www.cnblogs.com/mjios/archive/2013/03/20/2971275.html#label2)
- [三、其他用法](http://www.cnblogs.com/mjios/archive/2013/03/20/2971275.html#label3)
說明:這個C語言專題,是學習iOS開發的前奏。也為了讓有面向對象語言開發經驗的程序員,能夠快速上手C語言。如果你還沒有編程經驗,或者對C語言、iOS開發不感興趣,請忽略
上一篇已經介紹了[預處理指令中的宏定義](http://www.cnblogs.com/mjios/archive/2013/03/20/2969817.html),這篇就介紹一下條件編譯
[回到頂部](http://www.cnblogs.com/mjios/archive/2013/03/20/2971275.html#labelTop)
### 條件編譯的概念
在很多情況下,我們希望程序的其中一部分代碼只有在滿足一定條件時才進行編譯,否則不參與編譯(只有參與編譯的代碼最終才能被執行),這就是條件編譯。
[回到頂部](http://www.cnblogs.com/mjios/archive/2013/03/20/2971275.html#labelTop)
### 一、基本用法
~~~
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后面的條件一般是判斷宏定義而不是判斷變量,因為條件編譯是在編譯之前做的判斷,宏定義也是編譯之前定義的,而變量是在運行時才產生的、才有使用的意義
[回到頂部](http://www.cnblogs.com/mjios/archive/2013/03/20/2971275.html#labelTop)
### 二、舉個例子
~~~
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 }
~~~
代碼變得非常簡潔,輸出結果:
[回到頂部](http://www.cnblogs.com/mjios/archive/2013/03/20/2971275.html#labelTop)
### 三、其他用法
### 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編譯進去。
- 前言
- C語言入門教程1-概述
- C語言入門教程2-第一個C程序
- C語言入門教程3-關鍵字、標識符、注釋
- C語言入門教程4-變量與常量
- C語言入門教程5-進制
- C語言入門教程6-變量與內存
- C語言入門教程7-基本數據類型
- C語言入門教程8-運算符
- C語言入門教程9-流程控制
- C語言入門教程10-函數
- C語言入門教程11-函數的聲明定義
- C語言入門教程12-scanf與printf輸入輸出函數
- C語言入門教程13-數組-批量數據存儲
- C語言入門教程14-字符串
- C語言入門教程15-字符與字符串常用處理函數
- C語言入門教程16-指針
- C語言入門教程17-指向一維數組元素的指針
- C語言入門教程18-指針與字符串
- C語言入門教程19-預處理指令1-宏定義
- C語言入門教程20-預處理指令2-條件編譯
- C語言入門教程21-預處理指令3-文件包含
- C語言入門教程22-變量類型與作用域
- C語言入門教程23-枚舉
- C語言入門教程24-結構體
- C語言入門教程25-typedef類型別名