條件編譯

條件編譯

—般情況下,C語言源程式中的每一行代碼.都要參加編譯。但有時候出於對程式代碼最佳化的考慮.希望只對其中一部分內容進行編譯.此時就需要在程式中加上條件,讓編譯器只對滿足條件的代碼進行編譯,將不滿足條件的代碼捨棄,這就是條件編譯(conditional compile)。

基本介紹

  • 中文名:條件編譯
  • 外文名:conditional compile
  • 性質:計算機軟體
  • 類別:編程
條件編譯功能,條件編譯格式,if格式,ifdef格式,ifndef格式,排版,不相互嵌套,函式體外,函式體內,套用舉例,

條件編譯功能

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

條件編譯格式

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

if格式

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

ifdef格式

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

ifndef格式

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

排版

不相互嵌套

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

函式體外

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

函式體內

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

套用舉例

設有3個源檔案如圖16-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_Cvoid sub(){  ...}#endif
這樣就可以避免c.c的內容被重複包含。

相關詞條

熱門詞條

聯絡我們