9.3 條件編譯
條件編譯是指在編譯一個(gè)源程序文件時(shí),其中部分代碼段能根據(jù)條件成立與否有選擇地被編譯。即編譯程序只編譯沒(méi)有條件或條件成立的代碼段,而不編譯不滿(mǎn)足條件的代碼段。
條件編譯為組裝與環(huán)境有關(guān)的大程序提供有力的支持,能提高程序的可移植性和可維護(hù)性。通常在研制程序系統(tǒng)時(shí),設(shè)計(jì)者將所有與環(huán)境有關(guān)的內(nèi)容編寫(xiě)成獨(dú)立的程序段,并將它們配上相應(yīng)的條件編譯命令。因環(huán)境不同等原因,只要設(shè)定相應(yīng)條件,就能組裝出適應(yīng)環(huán)境要求的新程序。
條件編譯命令主要有三種相似的形式。
(1) #if 表達(dá)式
程序段1
# else
程序段2
# endif
其中表達(dá)式為常量表達(dá)式,其意義是當(dāng)指定的表達(dá)式值為非零時(shí),程序段1參與編譯,程序段2不參與編譯;否則,反之。
這種形式的條件編譯命令使預(yù)處理程序能根據(jù)給定的條件確定哪個(gè)程序段參與編譯,哪個(gè)程序段不參與編譯。
在上述一般形式中,當(dāng)程序段2不出現(xiàn)時(shí),也可簡(jiǎn)寫(xiě)為
#if 表達(dá)式
程序段
# endif
條件編譯與if語(yǔ)句有重要區(qū)別:條件編譯是在預(yù)處理時(shí)判定的,不產(chǎn)生判定代碼,其中一個(gè)不滿(mǎn)足條件的程序段不參與編譯,不會(huì)產(chǎn)生代碼;且語(yǔ)句是在運(yùn)行時(shí)判定的,且編譯產(chǎn)生判
定代碼和兩個(gè)分支程序段的代碼。因此,條件編譯可減少目標(biāo)程序長(zhǎng)度,能提高程序執(zhí)行速度。但條件編譯只能測(cè)試常值或常量表達(dá)式,而且語(yǔ)句能對(duì)表達(dá)式作動(dòng)態(tài)測(cè)試。
條件編譯預(yù)處理命令也可呈嵌套結(jié)構(gòu)。特別是為了便于描述# else后的程序段又是條件編譯情況,引人須處理命令符# elif。它的意思就是# else #if。所以條件編譯須處理命令更一般的形式為
# if 表達(dá)式 1
程序段1
# elif 表達(dá)式 2
程序段2
# elif 表達(dá)式 n
程序段n
# else
程序段 n+l
# endif
(2) # ifdef 標(biāo)識(shí)符
程序段1
# else
程序段2
# endif
其中標(biāo)識(shí)符是一個(gè)宏名,上述意義是當(dāng)宏名已被定義,則程序段里參與編譯,程序段2不參與編譯;否則,反之。這里的程序段可以是任何C代碼行,也可以包含預(yù)處理命令行。其中的標(biāo)識(shí)符只要求已定義與否,與標(biāo)識(shí)符被定義成什么是無(wú)關(guān)的。如標(biāo)識(shí)符只用于這個(gè)目的,常用以下形式的宏定義來(lái)定義這類(lèi)標(biāo)識(shí)符:
# define 標(biāo)識(shí)符
即標(biāo)識(shí)符之后為空,直接以換行結(jié)束該宏定義命令。
在上述一般形式中,如果程序段2為空,則可簡(jiǎn)寫(xiě)成如下一般形式:
# ifdef 標(biāo)識(shí)符
程序段
# endif
條件編譯主要作用是能提高程序的通用性,應(yīng)用于不同的計(jì)算機(jī)系統(tǒng)編譯不同的源程序段。條件編譯另一種應(yīng)用是在程序中插入調(diào)試狀態(tài)下輸出中間結(jié)果的代碼。如:
# ifdef DEBUG
printf(“a=%d, b=%d \n”, a, b);
# endif
程序在調(diào)試狀態(tài)下與包含宏定義命令
# define BEBUG
的頭文件一起編譯;在要獲得最終目標(biāo)程序時(shí),不與包含該宏定義命令的頭文件一起編譯。這樣,在調(diào)試通過(guò)后,不必再修改程序,已獲得了正確的最終程序。為了日后程序維護(hù),將調(diào)試時(shí)使用的程序代碼留在源程序中是專(zhuān)業(yè)程序員習(xí)慣采用的方法。因?yàn)檫@些代碼的存在不影響最終目標(biāo)碼,但有助于日后修改程序時(shí)的調(diào)試需要。
(3) # ifndef 標(biāo)識(shí)符
程序段1
# else
程序段2
# endif
這種條件編譯形式與前面介紹的形式的唯一差異是第一行的ifdef改為ifndef。其意義是當(dāng)標(biāo)識(shí)符末被定義時(shí),程序段1參與編譯,程序段2不參與編譯;否則,反之。在上述形式中,當(dāng)程序段2不出現(xiàn)時(shí),可簡(jiǎn)寫(xiě)成:
# infdef 標(biāo)識(shí)符
程序段
# endif
相關(guān)推薦:北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |