複製鏈接
請複製以下鏈接發送給好友

條件編譯

鎖定
一般情況下,C語言源程序中的每一行代碼都要參加編譯。但有時候出於對程序代碼優化的考慮,希望只對其中一部分內容進行編譯,此時就需要在程序中加上條件,讓編譯器只對滿足條件的代碼進行編譯,將不滿足條件的代碼捨棄,這就是條件編譯(conditional compile)。 [1] 
中文名
條件編譯
外文名
conditional compile
性    質
計算機軟件
類    別
編程

條件編譯條件編譯功能

預處理程序提供了條件編譯的功能。條件編譯允許只編譯源文件中滿足條件的程序段,使生成的目標程序較短,從而減少了內存的開銷,並提高程序的效率,可以按不同的條件去編譯不同的程序部分,因而產生不同的目標代碼文件。這對於程序的移植和調試是很有用的。 [2] 
另外,條件編譯是為了讓程序在各種不同的軟硬件環境下都以運行。即,提高了程序的可移植性和靈活性。
圖1 圖1
例如,一個商業性的軟件,所面向的用户羣有着:不同的軟件系統(有的是Windows XP系統,有的是Window 7系統)、不同的硬件系統(有的是Intel的處理器,有的是AMD的處理器),而這會導致同—段程序代碼在不同用户的電腦上產生不同的運行效果(有的流暢、有的卡頓、有的甚至無法運行),如圖1所示。 [3] 
解決這類問題可以有兩種方法。方法一:針對不同的環境編寫不同的代碼。方法二:同一段代碼,針對不同的環境,預編譯成不同代碼,從而使得生成的程序最大程度上適應用户的軟硬件環境。 [3] 

條件編譯條件編譯格式

在C語言中,若要對程序中的代碼段有條件地進行編譯,就要用到條件編譯命令,條件編譯主要有如下幾種格式: [1] 

條件編譯if格式

#if 表達式
     語句序列①
[#else
     語句序列②]
#endif
功能:當表達式的值為真時,編譯語句序列①,否則編譯語句序列②。其中,#else和語句序列②可有可無。 [1] 

條件編譯ifdef格式

#ifdef     標識符
     語句序列①
[#else
     語句序列②]
#endif
功能:當標識符已被定義時(用#define定義),編譯語句序列①,否則編譯語句序列②。其中#else和語句序列②可有可無。 [1] 

條件編譯ifndef格式

#ifndef     標識符
     語句序列①
[#else
     語句序列②]
#endif
功能:該格式功能與ifdef相反。 [1] 

條件編譯排版

條件編譯不相互嵌套

條件編譯關鍵字語句頂格左對齊;
所含的#include語句(塊) #define語句(塊)甚至是被嵌套下級條件編譯語句塊,按照語句塊嵌套的排版方式進行縮進排版。 [4] 

條件編譯函數體外

這種情況下,條件編譯語句塊不影響函數體
條件編譯關鍵字語句頂格左對齊;
所含的函數體定義無需縮進,依舊按照單個函數體定義的排版方式進行。

條件編譯函數體內

a)當條件編譯語句塊與被包語句所屬的語句塊之間沒有邏輯路徑交叉時
以下兩種方式均可按照語句塊嵌套方式進行縮進排版 (推薦);
條件編譯語句不影響原先語句塊排版,條件編譯語句與所包含的關鍵字語句塊左對齊。
b)當條件編譯語句塊與被包語句所屬的語句塊之間存在邏輯路徑交叉時
條件編譯語句頂格左對齊,其它語句按照正常順序排版。 [4] 

條件編譯應用舉例

設有3個源文件如圖2所示,其中存在着對同一個源文件重複包含的問題。請修改程序,不要刪除代碼,利用條件編譯避免重複包含,使得每個源文件都能通過編譯。 [5] 
圖2 圖2
分析:
源文件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
這樣就可以避免c.c的內容被重複包含。 [5] 
參考資料
  • 1.    陳惠明,趙青杉主編 .《C語言程序設計》.北京:中國鐵道出版社 ,2015
  • 2.    梁海英主編 .《C語言程序設計》.北京:清華大學出版社 ,2015
  • 3.    唐峻,高旭光,李淳編著 .《明明白白學通C語言 二維碼版》 .北京:清華大學出版社, 2015
  • 4.    C語言預處理命令之條件編譯(#ifdef,#else,#endif,#if等)  .酷勤網.2009-08-06[引用日期2013-11-25]
  • 5.    王金鵬著 .《深入淺出新編C程序設計教程》.北京:清華大學出版社, 2015