![第9章編譯預(yù)處理_第1頁(yè)](http://file4.renrendoc.com/view/5dc1252c4b2d1c4ac3fa7c7fb8763e5a/5dc1252c4b2d1c4ac3fa7c7fb8763e5a1.gif)
![第9章編譯預(yù)處理_第2頁(yè)](http://file4.renrendoc.com/view/5dc1252c4b2d1c4ac3fa7c7fb8763e5a/5dc1252c4b2d1c4ac3fa7c7fb8763e5a2.gif)
![第9章編譯預(yù)處理_第3頁(yè)](http://file4.renrendoc.com/view/5dc1252c4b2d1c4ac3fa7c7fb8763e5a/5dc1252c4b2d1c4ac3fa7c7fb8763e5a3.gif)
![第9章編譯預(yù)處理_第4頁(yè)](http://file4.renrendoc.com/view/5dc1252c4b2d1c4ac3fa7c7fb8763e5a/5dc1252c4b2d1c4ac3fa7c7fb8763e5a4.gif)
![第9章編譯預(yù)處理_第5頁(yè)](http://file4.renrendoc.com/view/5dc1252c4b2d1c4ac3fa7c7fb8763e5a/5dc1252c4b2d1c4ac3fa7c7fb8763e5a5.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第9章編譯預(yù)處理9.1宏定義9.2文件包含9.3條件編譯習(xí)題99.1宏定義
9.1.1無(wú)參數(shù)的宏定義 無(wú)參數(shù)宏的宏名后不帶參數(shù)。其定義的一般格式為 #define宏名字符串其中的“#”表示這是一條預(yù)處理命令。凡是以“#”開頭的均為預(yù)處理命令?!癲efine”為宏定義命令。“宏名”為所定義的宏名。“字符串”可以是常數(shù)、表達(dá)式和格式串等。在前面介紹過(guò)的符號(hào)常量的定義就是一種無(wú)參宏定義。此外,常對(duì)程序中反復(fù)使用的表達(dá)式進(jìn)行宏定義。 1.無(wú)參數(shù)宏定義符號(hào)常量 符號(hào)常量用無(wú)參數(shù)的宏定義語(yǔ)句定義,把符號(hào)常量名定義為指定的字符串,將程序中出現(xiàn)宏名的地方均用該字符串來(lái)替換。在進(jìn)行編譯預(yù)處理時(shí),用該字符串替代程序中出現(xiàn)的符號(hào)常量名。例如:#defineTRUE1#defineFALSE0 把TRUE定義為1,把FALSE定義為0。在符號(hào)常量定義之后,就可以用它來(lái)編碼了。 例如: if(i==TRUE) printf("youareright!\n"); elseif(i==FALSE) printf("youarewrong!\n"); 對(duì)于該程序段,在進(jìn)行編譯預(yù)處理時(shí),就把程序中出現(xiàn)的TRUE和FALSE分別用1和0替代,于是就變?yōu)閕f(i==1)printf("youareright!\n");elseif(i==0)printf("youarewrong!\n"); 在符號(hào)常量定義語(yǔ)句中,字符串可以是一個(gè)數(shù)值型數(shù)據(jù)、表達(dá)式或字符串。例如:#definePI3.1415926#defineS(PI*r*r)#definePRTprintf#defineA(20-(3*4)) 如果字符串是一個(gè)運(yùn)算表達(dá)式,一般應(yīng)該用括號(hào)括住它,以便把它視為一個(gè)操作對(duì)象與其他操作數(shù)進(jìn)行運(yùn)算,否則,會(huì)由于操作優(yōu)先級(jí)問(wèn)題而發(fā)生錯(cuò)誤。例如: text=A*8; 進(jìn)行編譯預(yù)處理后,該表達(dá)式變?yōu)? text=(20-(3*4))*8; 如果A定義為 #defineA20-(3*4) 則表達(dá)式text=A*8經(jīng)預(yù)編譯后變?yōu)? text=20-(3*4)*8; 這就不符合原意。因此,在宏定義語(yǔ)句中的字符串為一般表達(dá)式(而不是一個(gè)操作數(shù))時(shí),為了保證正確的運(yùn)算次序,應(yīng)該用括號(hào)括住它。因此在宏定義時(shí)必須十分注意,應(yīng)保證在宏代換之后不發(fā)生錯(cuò)誤。 2.無(wú)參數(shù)宏的好處 在程序設(shè)計(jì)中,使用無(wú)參數(shù)的宏有下面兩點(diǎn)好處: 1)增強(qiáng)程序的可讀性 以符號(hào)常量為例,由于符號(hào)常量含義明確,于是采用符號(hào)常量書寫的程序要比不采用符號(hào)常量的可讀性強(qiáng)。例如:#defineLENGTH20#defineWIDTH40#defineHEIGTH60 在程序中用LENGTH、WIDTH、HEIGTH時(shí),一看就知道它們分別代表長(zhǎng)、寬、高,而如果直接用20、40、60,則很難猜出它們是長(zhǎng)、寬、高。 2)增強(qiáng)程序的可維護(hù)性 如果一個(gè)常量在程序中多次被引用,則可把它定義為符號(hào)常量。這樣,在以后需改動(dòng)該常量時(shí),只需改動(dòng)它的宏定義語(yǔ)句即可,而不必對(duì)每一個(gè)引用它的地方進(jìn)行修改。這不但可以減少修改的工作量,而且可以避免漏改。 3.無(wú)參數(shù)宏的注意事項(xiàng) 使用無(wú)參數(shù)宏定義符號(hào)常量時(shí),一般應(yīng)注意以下幾點(diǎn)。 (1)宏定義是用宏名來(lái)表示一個(gè)字符串,在宏展開時(shí)又以該字符串取代宏名,這只是一種簡(jiǎn)單的代換,字符串中可以含任何字符,可以是常數(shù),也可以是表達(dá)式,預(yù)處理程序?qū)λ蛔魅魏螜z查。如有錯(cuò)誤,則只能在編譯已被宏展開后的源程序時(shí)發(fā)現(xiàn)。 (2)符號(hào)常量名一般用大寫字母(也可以用小寫字母)表示,以便與其他標(biāo)識(shí)符相區(qū)別。符號(hào)常量名的命名規(guī)則與一般標(biāo)識(shí)符相同。另外,應(yīng)考慮在字符串中根據(jù)需要加上括號(hào)。 (3)宏定義不是說(shuō)明或語(yǔ)句,因此,不能用分號(hào)結(jié)尾。如果加上分號(hào),則分號(hào)被作為字符串的一部分,連分號(hào)也一起置換。例如: #defineA60; 上面的格式表示A被定義為“60;”,而不是“60”。于是,在預(yù)編譯時(shí),程序中凡是出現(xiàn)A的地方,都用“60;”替換。這就不符合原意了。 (4)替換字符串可以為空。 (5)宏定義語(yǔ)句應(yīng)放在函數(shù)定義之外,符號(hào)常量的有效范圍是從定義它的宏定義語(yǔ)句開始至所在源文件的結(jié)尾。一般宏定義語(yǔ)句都放在源文件的開頭,以便使它對(duì)整個(gè)源文件都有效。 (6)為了靈活控制宏定義的作用范圍,可用“﹟undef”命令終止宏定義的作用域。 例如:#definePI3.14159main(){
}#undefPI /*PI的宏定義結(jié)束*/f1(){
} 表示PI只在main函數(shù)中有效,在f1中無(wú)效。 (7)宏定義允許嵌套,在宏定義的字符串中可以使用已經(jīng)定義的宏名。在宏展開時(shí)由預(yù)處理程序?qū)訉哟鷵Q。例如:#definePI3.14#defineR10#defineSPI*R*Rmain(){printf("S=%f",S);}預(yù)編譯后,該程序變?yōu)閙ain(){printf("S=%f",3.14*10*10);} (8)宏名在源程序中若用引號(hào)括起來(lái),則預(yù)處理程序不對(duì)其作宏代換。例如:#defineNO220main(){printf("NO");printf("\n");} 上例中定義宏名NO表示220,但在printf語(yǔ)句中NO被引號(hào)括起來(lái),因此不作宏代換。程序的運(yùn)行結(jié)果為 NO 表示把“NO”當(dāng)字符串處理。 【例9-1】假設(shè)血壓正常值低壓為70,高壓為120。如果低壓高于70,并且高壓低于120,則為正常。從鍵盤輸入血壓值,判斷該血壓值是否正常。#include<stdio.h>main()#defineLOW70 /*定義宏*/#defineHIGH120 /*定義宏*/{intbloodplow,bloodphigh;doscanf("%d%d",&bloodphigh,&bloodplow);while(bloodplow>=bloodphigh);if(bloodplow>LOW&bloodphigh<HIGH)printf("youareright!");elseprintf("youmayhavesomethingwrong!");}輸入:13080輸出:youmayhavesomethingwrong! 【例9-2】已知一梯形的上下兩邊的長(zhǎng)分別為a、b,輸入高h(yuǎn),求其面積。 #include<stdio.h>main()#definea5 /*定義宏*/#defineb15 /*定義宏*/#defineL(a+b) /*嵌套定義宏*/{floath,s;scanf("%f",&h);s=h*L/2;printf("s=%f\n",s);}輸入:3輸出:s=30.000000 【例9-3】利用迭代法求方程的根。其迭代公式為yi+1=(yi+x/yi)/2。#include"stdio.h"main()#defineABS1e-4{floaty1,y,x;printf("x=");scanf("%f",&x);printf("y=");scanf("%f",&y);do{y1=y;y=(y1+x/y1)/2;}while((y1-y)>ABS);printf("%f\n",y);}運(yùn)行結(jié)果:x=2y=31.414214 9.1.2帶參數(shù)的宏定義 1.帶參數(shù)的宏的定義 利用#define語(yǔ)句不僅可以定義符號(hào)常量,也可以定義帶參數(shù)的宏。帶參數(shù)的宏的一般定義格式為 #define宏名(參數(shù)表)字符串 字符串中包含參數(shù)表中的參數(shù)。 調(diào)用帶參數(shù)宏的一般格式為 宏名(實(shí)參表); 例如: #defineMIN(a,b)(((a)<(b))?(a):(b)) 其中,MIN(a,b)是帶參數(shù)的宏,a和b是形式參數(shù)。該定義把MIN(a,b)定義為“(((a)<(b))?(a):(b))”。在定義了該宏后,就可在程序中用MIN(a,b)替代定義它的運(yùn)算表達(dá)式“(((a)<(b))?(a):(b))”。宏的使用方法類似函數(shù)。例如,在需要求兩個(gè)數(shù)的最小值時(shí),就可以使用已定義的宏。 c=MIN(10,20); 在進(jìn)行編譯時(shí),預(yù)編譯程序根據(jù)宏定義式來(lái)替換程序中出現(xiàn)的帶參數(shù)的宏,其中定義式中的形式參數(shù)用相應(yīng)的實(shí)際參數(shù)替換。于是,上面的賦值語(yǔ)句變?yōu)? c=MIN((10<20)?10:20); 在程序設(shè)計(jì)中,經(jīng)常要把反復(fù)使用的運(yùn)算表達(dá)式定義為帶參數(shù)的宏。例如: #definePER(a,b)(100.0*(a)/(b)) /*求a是b的百分之幾*/ #defineABS(x)((x)>=0)?(x):-(x) /*求x的絕對(duì)值*/ #defineMAX(a,b)(((a)<(b))?(a):(b)) /*求兩個(gè)數(shù)中的較大數(shù)*/ #defineISO(x)(((x)%2==1)?1:0) /*判斷是否為奇數(shù)*/ 2.帶參數(shù)的宏的好處 使用帶參數(shù)的宏有下面兩點(diǎn)好處: (1)使程序更加簡(jiǎn)潔,減少不必要的重復(fù)書寫。 (2)增強(qiáng)程序的可讀性,一般用一個(gè)含義明確的宏名代替一個(gè)較復(fù)雜的運(yùn)算式,會(huì)使讀者一目了然。 3.帶參數(shù)的宏與函數(shù)的區(qū)別 從上面的介紹中可以看出,帶參數(shù)的宏和函數(shù)在使用形式和特性上都很相似。但是,二者又有本質(zhì)區(qū)別,主要表現(xiàn)在以下幾個(gè)方面。 (1)函數(shù)調(diào)用時(shí),要保留現(xiàn)場(chǎng)和返回點(diǎn),而后把控制轉(zhuǎn)移給被調(diào)用函數(shù)。當(dāng)被調(diào)用函數(shù)執(zhí)行結(jié)束后,又要恢復(fù)現(xiàn)場(chǎng)和把控制返回到調(diào)用函數(shù)。而對(duì)帶參數(shù)宏的使用不存在控制的來(lái)回轉(zhuǎn)移,它只是表達(dá)式的運(yùn)算。 (2)函數(shù)有一定的數(shù)據(jù)類型,且數(shù)據(jù)類型是不變的。而帶參數(shù)的宏一般是一個(gè)運(yùn)算表達(dá)式,它沒(méi)有固定的數(shù)據(jù)類型,其數(shù)據(jù)類型就是表達(dá)式運(yùn)算結(jié)果的數(shù)據(jù)類型。同一個(gè)帶參數(shù)的宏,隨著使用實(shí)參類型的不同,其運(yùn)算結(jié)果的類型也不同。 (3)函數(shù)定義和調(diào)用中使用的形參和實(shí)參都受數(shù)據(jù)類型的限制,而帶參數(shù)宏的形參和實(shí)參可以是任意的數(shù)據(jù)類型。 (4)函數(shù)調(diào)用中存在參數(shù)的傳遞過(guò)程,而帶參數(shù)宏的引用不存在參數(shù)傳遞過(guò)程。在函數(shù)中,形參和實(shí)參是兩個(gè)不同的量,各有自己的作用域,調(diào)用時(shí)要把實(shí)參值賦予形參,進(jìn)行“值傳遞”。而在帶參宏中,只是符號(hào)代換,不存在值傳遞的問(wèn)題。在宏定義中的形參是標(biāo)識(shí)符,而宏調(diào)用中的實(shí)參可以是表達(dá)式。例如:#defineSQ(y)(y)*(y)main(){inta,sq;printf("inputanumber:");scanf("%d",&a);sq=SQ(a+1);printf("sq=%d\n",sq);} 上例中第1行為宏定義,形參為y。程序第7行宏調(diào)用中實(shí)參為a+1,是一個(gè)表達(dá)式,在宏展開時(shí),用a+1代換y,再用(y)*(y)代換SQ,得到如下語(yǔ)句: sq=(a+1)*(a+1); 這與函數(shù)的調(diào)用是不同的,函數(shù)調(diào)用時(shí)要把實(shí)參表達(dá)式的值求出來(lái)再賦予形參。而宏代換中對(duì)實(shí)參表達(dá)式不作計(jì)算直接地照原樣代換。 (5)使用函數(shù)可縮短程序占用的內(nèi)存空間,但由于控制的來(lái)回轉(zhuǎn)移,會(huì)使程序的執(zhí)行效率降低。而帶參數(shù)的宏則相反,多次使用宏會(huì)增加程序占用的存儲(chǔ)空間,但其執(zhí)行效率要比函數(shù)高。 除了使用運(yùn)算表達(dá)式來(lái)定義帶參數(shù)的宏外,還可使用函數(shù)來(lái)定義它,標(biāo)準(zhǔn)函數(shù)庫(kù)中經(jīng)常采用這種方式。例如:#definegetchar()fgetc(stdin)#defineputchar(ch)fputc(ch,stdout) (6)宏定義也可用來(lái)定義多個(gè)語(yǔ)句,在宏調(diào)用時(shí),把這些語(yǔ)句又代換到源程序內(nèi)??聪旅娴睦樱?defineSSSV(s1,s2,s3,v)s1=l*w;s2=l*h;s3=w*h;v=w*l*h;main(){intl=3,w=4,h=5,sa,sb,sc,vv;SSSV(sa,sb,sc,vv);printf("sa=%d\nsb=%d\nsc=%d\nvv=%d\n",sa,sb,sc,vv);} 程序第1行為宏定義,用宏名SSSV表示4個(gè)賦值語(yǔ)句,4個(gè)形參分別為4個(gè)賦值符左部的變量。在宏調(diào)用時(shí),把4個(gè)語(yǔ)句展開并用實(shí)參代替形參。使計(jì)算結(jié)果送入實(shí)參之中。 4.帶參數(shù)的宏的注意事項(xiàng) 為了正確定義和使用帶參數(shù)的宏,編程時(shí)應(yīng)注意以下幾點(diǎn)。 (1)對(duì)宏定義語(yǔ)句中的定義式和形式參數(shù),要根據(jù)需要加上圓括號(hào),以免發(fā)生運(yùn)算錯(cuò)誤。例如:#defineX(a)((a)*(a)*(a))
a1=1;a2=2;x=X(a1+a2); 經(jīng)過(guò)預(yù)編譯后,該賦值語(yǔ)句變?yōu)? x=((a1+a2)*(a1+a2)*(a1+a2)); 如果定義式中不使用相應(yīng)的括號(hào),則預(yù)編譯后的賦值語(yǔ)句變?yōu)? x=a1+a2*a1+a2*a1+a2; 這樣就與原來(lái)的意思不符合了。所以在定義帶參數(shù)的宏時(shí),一定要注意加上相應(yīng)的括號(hào)。 (2)在定義帶參數(shù)的宏時(shí),在宏名和帶參數(shù)的圓括號(hào)間不能有空格,否則,空格之后的字符串都將被視為替代字符串。例如:若把 #defineMAX(a,b)(a>b)?a:b 改寫為#defineMAX(a,b)(a>b)?a:b 將被認(rèn)為是無(wú)參宏定義,宏名MAX代表字符串“(a,b)(a>b)?a:b”。宏展開時(shí),宏調(diào)用語(yǔ)句: max=MAX(x,y); 將變?yōu)閙ax=(a,b)(a>b)?a:b(x,y); 這顯然是錯(cuò)誤的。 【例9-4】鍵盤輸入立方體的邊長(zhǎng)a,求其表面積s及體積v。#include<stdio.h>main()#defineL(a,s,v)s=6*a*a;v=a*a*a{inta1,s1,v1;a1=0;scanf("%d",&a1);L(a1,s1,v1);printf("%d,%d,%d\n",a1,s1,v1);} 【例9-5】求1~100所有奇數(shù)的和。#include<stdio.h>main()#defineISODD(x)(((x)%2==1)?1:0){intsum,i;sum=1;for(i=3;i<=100;i++)ifISODD(i)sum+=i;printf("%d\n",sum);} 【例9-6】已知某單位上繳個(gè)人所得稅的算法如下: 輸入工資,求其應(yīng)上繳的稅款。#include<stdio.h>main()#defineTAX1(a)((a<=800)?0:((a<1300)?0.05:((a<=2800)?0.1:((a<=5800)?0.15:0.2))))#defineTAX2(b)((b<=1300)?0:((b<=2800)?25:((b<=5800)?125:375)))#defineTAX3(c)c*TAX1(c)-TAX2(c){floattax,wage;scanf("%f",&wage);tax=TAX3(wage);printf("%f,%f\n",wage,tax);} 【例9-7】輸入4個(gè)整數(shù),按由小到大的順序輸出。#include<stdio.h>main()#defineCHANGE(a,b){intt;t=a;a=b;b=t;}{inti,j,k,l;printf("pleaseinputfournumber:");scanf("%d,%d,%d,%d",&i,&j,&k,&l);if(i>j)CHANGE(i,j);if(i>k)CHANGE(i,k);if(i>l)CHANGE(i,l);if(j>k)CHANGE(j,k);if(j>l)CHANGE(j,l);if(k>l)CHANGE(k,l);printf("theproperorderis:");printf("%d%d%d%d\n",i,j,k,l);}9.2文件包含 在前面章節(jié)中,我們經(jīng)常在編寫程序中,會(huì)寫上下面的語(yǔ)句: #include<stdio.h> 其含義是在編譯時(shí),用stdio.h頭文件的內(nèi)容替換該語(yǔ)句。 文件包含語(yǔ)句的一般格式為 #include"文件名" 或#include<文件名> 其中,<文件名>是被包含文件的文件名,它是一個(gè)磁盤文件。該預(yù)編譯語(yǔ)句的功能是要將 <文件名>所指文件的全部?jī)?nèi)容包含在該#include語(yǔ)句所在的源文件中。也就是說(shuō),在預(yù)編譯時(shí),用<文件名>所指文件的全部?jī)?nèi)容替換該#include語(yǔ)句行,使該文件成為這個(gè)源文件的一部分。 在#include語(yǔ)句的書寫格式中,被包含文件的文件名可用尖括號(hào)(<>)括住,也可以用雙引號(hào)("")括住。 當(dāng)用尖括號(hào)括住時(shí),表示編譯系統(tǒng)按系統(tǒng)設(shè)定的標(biāo)準(zhǔn)目錄搜索文件;當(dāng)用雙引號(hào)括住時(shí),表示按指定的路徑搜索。若未指定路徑名時(shí),則在當(dāng)前目錄中搜索。 文件包含語(yǔ)句是很有用的語(yǔ)句,特別是對(duì)包括多個(gè)源文件的大程序來(lái)說(shuō),可以把各個(gè)源文件中共同使用的函數(shù)說(shuō)明、符號(hào)常量定義、外部量說(shuō)明、宏定義和結(jié)構(gòu)類型定義等寫成一個(gè)獨(dú)立的包含文件,在需要這些說(shuō)明的源文件中,只需在源文件的開頭用一個(gè)#include語(yǔ)句把該文件包括進(jìn)來(lái),這樣就可以避免重復(fù)工作。例如:/*file1.c*/#include"file2.h"main(){
}/*file2.h*/#definePI3.14159 做成包含文件的另一個(gè)好處是,當(dāng)這些常量、宏定義等需要修改時(shí),只需修改這個(gè)被包含的文件即可,而不必修改各源文件。 使用#include語(yǔ)句時(shí),應(yīng)注意以下兩點(diǎn): (1)一個(gè)include命令只能指定一個(gè)被包含文件,若有多個(gè)文件要包含,則需用多個(gè)include命令。 (2)文件包含允許嵌套,即在一個(gè)被包含的文件中又可以包含另一個(gè)文件。9.3條件編譯 一般情況下,源程序中所有的行都參加編譯,但有時(shí)在寫程序時(shí)要求根據(jù)具體情況編譯不同的程序代碼,C語(yǔ)言中提供了條件編譯,可以按不同的條件去編譯不同的程序部分,因而產(chǎn)生不同的目標(biāo)代碼文件。這對(duì)于程序的移植和調(diào)試是很有用的。條件編譯有3種形式,下面分別介紹。 1.#ifdef…#else…#endif語(yǔ)句 用#ifdef…#else…#endif語(yǔ)句進(jìn)行條件編譯的指令格式為 #ifdef標(biāo)識(shí)符程序段1[#else程序段2]#endif 其作用是:如果標(biāo)識(shí)符已被定義(用#define定義),則對(duì)程序段1進(jìn)行編譯,而程序段2被刪除;否則,程序段1被刪除,編譯程序段2。其中,#else部分是可以缺省的,即#ifdef標(biāo)識(shí)符程序段1#endif 條件編譯語(yǔ)句中的#ifdef和#endif決定了編譯范圍,在此范圍外的源程序不存在條件編譯問(wèn)題。條件編譯對(duì)于提高程序的移植性很有幫助。
【例9-8】條件編譯#ifdef的使用。#include"stdio.h"#defineTED10main(){#ifdefTEDprintf("HiTed\n"); /*如果定義了TED,則編譯此行代碼*/#elseprintf("Hianyone\n"); /*如果沒(méi)用定義TED,則編譯此行代碼*/printf("Hianyone\n"); /*如果沒(méi)用定義TED,則編譯此行代碼*/#endif#ifndefRALPHprintf("RALPHnotdefined\n"); /*如果定義了RALPH,則編譯此行代碼*/#endif} 上述代碼打印“HiTed”及“RALPHnotdefined”。如果TED沒(méi)有定義,則顯示“Hianyone”,后面是“RALPHnotdefined”??梢韵袂短?if那樣將#ifdef與#ifndef嵌套至任意深度。 2.#ifndef…#else…#endif語(yǔ)句 由#ifndef…#else…#endif語(yǔ)句進(jìn)行條件編譯的指令格式為#ifndef標(biāo)識(shí)符程序段1[#else程序段2]#endif 與第一種形式的區(qū)別是將“ifdef”改為“ifndef”。它的功能是:如果標(biāo)識(shí)符未被#define命令定義,則對(duì)程序段1進(jìn)行編譯,否則對(duì)程序段2進(jìn)行編譯。這與第一種形式的功能正相反。例如:#ifndefUNPRNprintf("Name=%ssa=%f",name,s);#elseprintf("%s%f",name,s);#endif 當(dāng)UNPRN在程序段之前未定義時(shí),則只編譯“printf("Name=%ssa=%f",name,s);”。如果在該程序段之前加一行: #defineUNPRN1 則只編譯“printf("%s%f",name,s);”。其中,UNPRN可定義為任何字符串。 3.#if…#else…#endif語(yǔ)句 由#if…#else…#endif語(yǔ)句進(jìn)行條件編譯的指令格式為#if表達(dá)式程序段1[#else程序段2]#endif 其作用是:當(dāng)表達(dá)式的值為非0時(shí),編譯程序段1,不編譯程序段2;否則編譯程序段2(其中#else部分是可以缺省的)。例如,在程序設(shè)計(jì)的測(cè)試階段,經(jīng)常要顯示一些變量的信息,以檢查是否正確,而在正式執(zhí)行時(shí),卻不需要顯示這些信息。這時(shí),就可以用下面形式的條件編譯。#defineDEBUG1#ifDEBUGprintf("a=%db=%fc=%s",a,b,c);#endif 以上形式的條件編譯適用測(cè)試階段,如果程序測(cè)試完成,在編譯正式的執(zhí)行代碼時(shí),只需把DEBUG定義為0即可。在進(jìn)行條件編譯時(shí),可根據(jù)情況選擇條件編譯語(yǔ)句。 【例9-9】條件編譯#if的使用。#include"stdio.h"#defineR1main(){floatc,r,s;printf("inputanumber:");scanf("%f",&c);#ifR r=3.14159*c*c; /*如果R非0,則編譯此行和下一行代碼
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030年戶外露營(yíng)折疊躺椅企業(yè)制定與實(shí)施新質(zhì)生產(chǎn)力戰(zhàn)略研究報(bào)告
- 2025-2030年按摩球套裝企業(yè)制定與實(shí)施新質(zhì)生產(chǎn)力戰(zhàn)略研究報(bào)告
- 2025-2030年文具定制印刷行業(yè)跨境出海戰(zhàn)略研究報(bào)告
- 2025-2030年堅(jiān)果風(fēng)味糕點(diǎn)創(chuàng)新口味企業(yè)制定與實(shí)施新質(zhì)生產(chǎn)力戰(zhàn)略研究報(bào)告
- 2025-2030年文具收納盒行業(yè)深度調(diào)研及發(fā)展戰(zhàn)略咨詢報(bào)告
- 2025-2030年數(shù)據(jù)存儲(chǔ)服務(wù)器集群行業(yè)跨境出海戰(zhàn)略研究報(bào)告
- 危險(xiǎn)品分類與標(biāo)識(shí)考核試卷
- 2025-2030年廚房食物真空袋行業(yè)深度調(diào)研及發(fā)展戰(zhàn)略咨詢報(bào)告
- 2025-2030年商用高效食品烘干設(shè)備企業(yè)制定與實(shí)施新質(zhì)生產(chǎn)力戰(zhàn)略研究報(bào)告
- 搬家企業(yè)形象宣傳與市場(chǎng)推廣考核試卷
- 實(shí)驗(yàn)室的設(shè)計(jì)規(guī)劃
- 注冊(cè)安全工程師《安全生產(chǎn)管理知識(shí)》科目知識(shí)要點(diǎn)
- 《新時(shí)代公民道德建設(shè)實(shí)施綱要》、《新時(shí)代愛國(guó)主義教育實(shí)施綱要》知識(shí)競(jìng)賽試題庫(kù)55題(含答案)
- 2024-2030年中國(guó)假睫毛行業(yè)市場(chǎng)發(fā)展趨勢(shì)與前景展望戰(zhàn)略分析報(bào)告
- 2019-2020學(xué)年七年級(jí)(上)期末數(shù)學(xué)試卷2附解析
- 電話接聽技巧與服務(wù)質(zhì)量提升方案三篇
- 德國(guó)職業(yè)學(xué)校教育質(zhì)量保障體系研究
- 2023-2024學(xué)年北師大版數(shù)學(xué)八年級(jí)上冊(cè) 期末測(cè)試卷
- 第3篇 助跑 項(xiàng)目六 異形芯片分揀與安裝講解
- 承包貨車司機(jī)合同范本
- 傳統(tǒng)戲劇藝術(shù)與人工智能的創(chuàng)新傳播渠道
評(píng)論
0/150
提交評(píng)論