-
條件編譯
鎖定
一般情況下,C語言源程序中的每一行代碼都要參加編譯。但有時候出於對程序代碼優化的考慮,希望只對其中一部分內容進行編譯,此時就需要在程序中加上條件,讓編譯器只對滿足條件的代碼進行編譯,將不滿足條件的代碼捨棄,這就是條件編譯(conditional compile)。
[1]
- 中文名
- 條件編譯
- 外文名
- conditional compile
- 性 質
- 計算機軟件
- 類 別
- 編程
條件編譯條件編譯功能
預處理程序提供了條件編譯的功能。條件編譯允許只編譯源文件中滿足條件的程序段,使生成的目標程序較短,從而減少了內存的開銷,並提高程序的效率,可以按不同的條件去編譯不同的程序部分,因而產生不同的目標代碼文件。這對於程序的移植和調試是很有用的。
[2]
另外,條件編譯是為了讓程序在各種不同的軟硬件環境下都以運行。即,提高了程序的可移植性和靈活性。
例如,一個商業性的軟件,所面向的用户羣有着:不同的軟件系統(有的是Windows XP系統,有的是Window 7系統)、不同的硬件系統(有的是Intel的處理器,有的是AMD的處理器),而這會導致同—段程序代碼在不同用户的電腦上產生不同的運行效果(有的流暢、有的卡頓、有的甚至無法運行),如圖1所示。
[3]
條件編譯條件編譯格式
條件編譯if格式
#if 表達式 語句序列① [#else 語句序列②] #endif
條件編譯ifdef格式
#ifdef 標識符 語句序列① [#else 語句序列②] #endif
條件編譯ifndef格式
#ifndef 標識符 語句序列① [#else 語句序列②] #endif
條件編譯排版
條件編譯不相互嵌套
條件編譯關鍵字語句頂格左對齊;
條件編譯函數體外
這種情況下,條件編譯語句塊不影響函數體
條件編譯關鍵字語句頂格左對齊;
條件編譯函數體內
a)當條件編譯語句塊與被包語句所屬的語句塊之間沒有邏輯路徑交叉時
以下兩種方式均可按照語句塊嵌套方式進行縮進排版 (推薦);
條件編譯語句不影響原先語句塊排版,條件編譯語句與所包含的關鍵字語句塊左對齊。
b)當條件編譯語句塊與被包語句所屬的語句塊之間存在邏輯路徑交叉時
條件編譯應用舉例
分析:
源文件a.c中的main()函數要調用b.c中的subl()函數,也要調用c.c中的sub2()函數,所以,文件a.c包含了b.c和c.c。源文件b.c中的sub3()函數要調用c.c中的 sub2()函數,所以b.c也包含c.c。這樣一來就造成了重複包含的問題,即文件a.c包含了兩次c.c,a.c的內容相當於是這樣的:
其中c.c的內容出現了兩遍,就有了兩次sub2()函數的定義,導致編譯錯誤。
要解決這個問題,需要用條件編譯,將c.c的內容放在條件編譯控制之下,即將c.c的內容修改為
//c.c #ifndef FILE_C #define FILE_C void sub() { ... } #endif
- 參考資料
-
- 1. 陳惠明,趙青杉主編 .《C語言程序設計》.北京:中國鐵道出版社 ,2015
- 2. 梁海英主編 .《C語言程序設計》.北京:清華大學出版社 ,2015
- 3. 唐峻,高旭光,李淳編著 .《明明白白學通C語言 二維碼版》 .北京:清華大學出版社, 2015
- 4. C語言預處理命令之條件編譯(#ifdef,#else,#endif,#if等) .酷勤網.2009-08-06[引用日期2013-11-25]
- 5. 王金鵬著 .《深入淺出新編C程序設計教程》.北京:清華大學出版社, 2015