出處:
有些程式在除錯、相容性、平台移植等情況下可能想要通過簡單地設定一些引數就生成乙個不同的軟體,這當然可以通過變數設定,把所有可能用到的**都寫進去,在初始化時配置,但在不同的情況下可能只用到一部分**,就沒必要把所有的**都寫進去,就可以用條件編譯,通過預編譯指令設定編譯條件,在不同的需要時編譯不同的**。
(一)條件編譯方法
條件編譯是通過預編譯指令來實現的,主要方法有:
1、#if, #elif, #else, #endif
#if 條件 1
**段 1
#elif 條件 2
**段 2
...#elif 條件 n
**段 n
#else
**段 n+1
#endif
即可以設定不同的條件,在編譯時編譯不同的**,預編譯指令中的表示式與c語言本身的表示式基本一至如邏輯運算、算術運算、位運算等均可以在預編譯指令中使用。之所以能夠實現條件編譯是因為預編譯指令是在編譯之前進行處理的,通過預編譯進行巨集替換、條件選擇**段,然後生成最後的待編譯**,最後進行編譯。
#if的一般含義是,如果#if後面的常量表示式為true,則編譯它所控制的**,如條件1成立時就**段1,條件1不成立再看條件2是否成立,如果條件2成立則編譯**段2,否則再依次類推判斷其它條件,如果條件1-n都不成力則會編譯最後的**段n+1.
2、#ifdef, #else, #endif或#ifndef, #else, #endif
條件編譯的另一種方法是用#ifdef與#ifndef命令,它們分別表示「如果有定義」及「如果無定義」。有定義是指在編譯此段**時是否有某個巨集通過 #define 指令定義的巨集,#ifndef指令指找不到通過#define定義的某巨集,該巨集可以是在當前檔案此條指令的關面定義的,也可以是在其它檔案中,但在此指令之前包含到該檔案中的。
#ifdef的一般形式是:
#ifdef macro_name
**段 1
#else
**段 2
#endif
或#ifdef的一般形式是:
#ifndef macro_name
**段 2
#else
**段 1
#endif
這兩段**的效果是完全一樣的。
3、通過巨集函式defined(macro_name)
引數為巨集名(無需加""),如果該macro_name定義過則返回真,否則返回假,用該函式則可以寫比較複雜的條件編譯指令如
#if defined(macro1) || (!defined(macro2) && defined(macro3))
...#else
...#endif
(二)條件編譯技巧與示例
(1)#ifdef和#defined()比較
首先比較一下這兩種方法,第一種方法只能判斷乙個巨集,如果條件比較複雜實現起來比較煩鎖,用後者就比較方便。如有兩個巨集macro_1,macro_2只有兩個巨集都定義過才會編譯**段a,分別實現如下:
#ifdef macro_1
#ifdef macro_2
**段 a
#endif
#endif
或者#if defined(macro_1) && defined(macro_2)
#endif
同樣,要實現更複雜的條件用#ifdef更麻煩,所以推薦使用後者,因為即使當前**用的是簡單的條件編譯,以後在維護、公升級時可能會增加,用後者可維護性較強。舊的編譯器可能沒有實現#defined()指令,c99已經加為標準。要相容老的編譯器,還需用#ifdef指令。
C C 條件編譯
04 巨集定義 05 總結 條件編譯是指預處理器根據條件編譯指令,有條件地選擇源程式 中的一部分 作為輸出,送給編譯器進行編譯。主要是為了有選擇性地執行相應操作,防止巨集替換內容 如檔案等 的重複包含。常見的條件編譯指令如下 條件編譯指令 描述 description if如果條件為真,則執行相應操...
C C 條件編譯
條件編譯就是指有條件的編譯,即根據條件去編譯 在編譯階段時就對 做出取捨,有的編譯,有的不編譯,這樣比寫成乙個個判斷函式更有效率,比如工程 大部分的地方都類似,只有個別語句因為使用的硬體版本不同,就可以使用條件編譯增加可移植性。條件編譯的 條件 可以是乙個表示式的值,也可以是乙個定義的巨集。對於前者...
C C 複習之 條件編譯
條件編譯功能對於程式的移植和裁剪時很有用的,檢視過 cos 作業系統的核心源 裡面大量使用了條件編譯,方便使用者根據自個的需要,對系統核心進行裁剪。條件編譯的3種形式 1 ifdef 識別符號 程式段1 else 程式段2 endif作用 如果指定的識別符號已經被 define命令定義,則編譯程式段...