預處理程式提供了條件編譯的功能。可以按不同的條件去編譯不同的程式部分,因而產生不同的目標**檔案。這對於程式的移植和除錯是很有用的。條件編譯有三種形式,下面分別介紹:
#ifdef 識別符號
程式段1
#else
程式段2
#endif
它的功能是,如果識別符號已被 #define命令定義過則對程式段1進行編譯;否則對程式段2進行編譯。如果沒有程式段2(它為空),本格式中的#else可以沒有,即可以寫為:
#ifdef 識別符號
程式段#endif
【例9.12】
#define num ok
main() *ps;
ps=(struct stu*)malloc(sizeof(struct stu));
ps->num=102;
ps->name="zhang ping";
ps->***='m';
ps->score=62.5;
#ifdef num
printf("number=%d\nscore=%f\n",ps->num,ps->score);
#else
printf("name=%s\n***=%c\n",ps->name,ps->***);
#endif
free(ps);
}
由於在程式的第16行插入了條件編譯預處理命令,因此要根據num是否被定義過來決定編譯那乙個printf語句。而在程式的第一行已對num作過巨集定義,因此應對第乙個printf語句作編譯故執行結果是輸出了學號和成績。
在程式的第一行巨集定義中,定義num表示字串ok,其實也可以為任何字串,甚至不給出任何字串,寫為:
#define num
也具有同樣的意義。只有取消程式的第一行才會去編譯第二個printf語句。讀者可上機試作。
#ifndef 識別符號
程式段1
#else
程式段2
#endif
與第一種形式的區別是將「ifdef」改為「ifndef」。它的功能是,如果識別符號未被#define命令定義過則對程式段1進行編譯,否則對程式段2進行編譯。這與第一種形式的功能正相反。
#if 常量表示式
程式段1
#else
程式段2
#endif
它的功能是,如常量表示式的值為真(非0),則對程式段1 進行編譯,否則對程式段2進行編譯。因此可以使程式在不同條件下,完成不同的功能。
【例9.13】
#define r 1
main()
本例中採用了第三種形式的條件編譯。在程式第一行巨集定義中,定義r為1,因此在條件編譯時,常量表示式的值為真,故計算並輸出圓面積。
上面介紹的條件編譯當然也可以用條件語句來實現。 但是用條件語句將會對整個源程式進行編譯,生成的目標**程式很長,而採用條件編譯,則根據條件只編譯其中的程式段1或程式段2,生成的目標程式較短。如果條件選擇的程式段很長,採用條件編譯的方法是十分必要的。
c語言條件編譯詳解
指令 用途 空指令,無任何效果 include 包含乙個源 檔案 define 定義巨集 undef 取消已定義的巨集 if 如果給定條件為真,則編譯下面 ifdef 如果巨集已經定義,則編譯下面 ifndef 如果巨集沒有定義,則編譯下面 elif 如果前面的 if給定條件不為真,當前條件為真,則...
C語言條件編譯詳解
指令 用途 空指令,無任何效果 include 包含乙個源 檔案 define 定義巨集 undef 取消已定義的巨集 if 如果給定條件為真,則編譯下面 ifdef 如果巨集已經定義,則編譯下面 ifndef 如果巨集沒有定義,則編譯下面 elif 如果前面的 if給定條件不為真,當前條件為真,則...
C 條件編譯詳解
一般情況下,在進行編譯時對源程式中的每一行都要編譯。但是有時希望程式中某一部分內容只在滿足一定條件時才進行編譯,也就是指定對程式中的一部分內容進行編譯的條件。如果不滿足這個條件,就不編譯這部分內容。這就是 條件編譯 其實這跟事物具有多樣性一樣。我們需要對不同的狀況下採取不同的操作。例如程式的執行平台...