




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第12章編譯預(yù)處理12.1宏定義12.2文件包含
12.3條件編譯12.4圖形處理12.1宏定義12.1.1不帶參數(shù)的宏定義
定義形式: #define宏名宏體宏名是一自定義標(biāo)識符,宏體是一字符串,在程序中可用宏名代表宏體。
例如,用PI代表3.1415926,用PR代表printf,宏定義如下:
(1)#definePI3.1415926(2)#defineePRprintf
程序中凡是出現(xiàn)3.1415926的地方,都可以以PI出現(xiàn),凡是出現(xiàn)printf的地方,都可以以PR出現(xiàn)。例12-1
利用宏定義求圓的周長和面積。/*程序12-1,利用宏定義求圓的周長和面積*/#definePI3.1415926#defineR1.0main(){floatl,s;
l=2.0*PI*R;
s=PI*R*R;
PR(″周長=%f,面積=%f\n″,l,s);}
上面程序在編譯前將進(jìn)行宏展開,宏展開以后變?yōu)椋?/p>
main()
{floatl,s;
l=2.0*3.1415926*1.0;
s=3.1415926*1.0*1.0;
printf(″周長=%f,面積=%f\n″,l,s);
}
說明:
(1)宏名一般習(xí)慣用大寫字母表示,以便與變量名相區(qū)別。當(dāng)然可以使用小寫字母。
(2)宏定義是用宏名簡單替換宏體,也就是作簡單的置換,不作語法檢查,出現(xiàn)錯誤也不會報告,只有在宏展開后編譯時才會報告錯誤。
(3)程序中雙引號中與宏名相同的內(nèi)容不被替換。
(4)宏展開后源程序?qū)⒆冮L。(5)使用宏名,可以減少程序中重復(fù)書寫某些宏體的工作量。
(6)宏定義一般放在程序的開頭,宏名的有效范圍為定義位置到文件結(jié)束。
(7)宏定義可以嵌套,后定義的宏可使用已定義的宏。12.1.2帶參數(shù)的宏定義
定義形式: #define宏名(參數(shù)表)宏體帶參數(shù)的宏展開時要從左至右進(jìn)行參數(shù)的簡單替換,使用起來較無參數(shù)宏定義復(fù)雜。例如:
(1)#define S(n)(n)*(n)*(n)
(2)#define T(n)1/(n)第一個式子代表n的立方,第二個式子代表n的倒數(shù)。
說明:
(1)列出的參數(shù)必須在宏體中用到。
(2)帶參數(shù)的宏展開只是將實參簡單替換形參。如有宏定義: #defineS(n)n*n*n
若將形參n用實參a+b替換,S(a+b)會變成a+b*a+b*a+b,顯然與原意不相符。如將宏定義改成:
#defineS(n)(n)*(n)*(n) S(a+b)才被替換為需要的(a+b)*(a+b)*(a+b)。因此,在帶參的宏定義中,參數(shù)一般應(yīng)加括號來描述。(3)宏定義時,在宏名與帶參數(shù)的括號之間不應(yīng)加空格,否則將空格以后的部分都作為宏體。例如:#defineS(n)(n)*(n)*(n)S被認(rèn)為是不帶參數(shù)的宏名,它代表“(n)(n)*(n)*(n)”這樣的宏體。
(4)如在宏體中的參數(shù)前加上“?!保瑒t在宏展開后該實參前后會加上雙引號,變成字符串。例12–2
利用帶參數(shù)的宏定義求圓的周長和面積/*程序12-2,利用帶參數(shù)的宏定義求圓的周長和面積*/#defineR1.0#definePI3.14159#defineC(r)2*PI*(r)#defineS(r)PI*(r)*(r)main(){printf(″周長=%f,面積=%f\n″,C(R),S(R));}
上面程序宏展開后如下:main(){printf(″周長=%f,面積=%f\n″,2*3.14159*1.0,3.14159*1.0*1.0);}
帶參數(shù)的宏又稱為函數(shù)宏,函數(shù)宏不是函數(shù),這是因為:
(1)函數(shù)調(diào)用要求形參和實參類型一致,如實參是表達(dá)式,則必須先計算出值;宏名無類型,宏體也無類型,宏展開只進(jìn)行參數(shù)的簡單替換。(2)函數(shù)調(diào)用是在程序運行時處理的,分配臨時的內(nèi)存單元,有返回值;而宏展開是在編譯前進(jìn)行的,展開時并不分配內(nèi)存單元,不進(jìn)行值的傳遞,無返回值。
(3)宏展開將使源程序變長;而函數(shù)調(diào)用不增加源程序的長度。
(4)宏替換不占用運行時間,只占用編譯時間;而函數(shù)調(diào)用則占用運行時間(分配單元、保留現(xiàn)場、值傳遞、返回)。
(5)一般用宏代表簡單的表達(dá)式比較合適。有些問題用宏和函數(shù)都可以解決。12.1.3預(yù)定義宏預(yù)定義宏由系統(tǒng)提供,宏名的開始和結(jié)尾均為下劃線。_TURBOC_:當(dāng)前TURBOC的版本號。_LINE_:源程序行號,第一行定義為1。_FILE_:源程序文件名。_DATE_:當(dāng)前編譯日期。
_TIME_:當(dāng)前編譯時間。12.1.4取消宏定義
形式一: #undef宏名取消前面定義的宏名,使宏名局部化,取消以后不能再使用。12.2文件包含
文件包含是指一個C語言源程序中將另一個C語言源程序包含進(jìn)來,通過include預(yù)處理指令實現(xiàn)。一般形式: #include″被包含文件名″或 #include<被包含文件名>(1)被包含的文件一般指定為頭文件(*.h),也可為C程序等文件。
(2)一個include指令只能指定一個被包含文件,如果要包含n個文件,則要用到n條include指令。
(3)不能包含OBJ文件。文件包含是在編譯前進(jìn)行處理,不是在連接時進(jìn)行處理。
作用:將指定文件包含在當(dāng)前文件中或插入至文件包含指令的相應(yīng)位置處。使用文件包含指令,可以減少程序設(shè)計人員的重復(fù)勞動,提高程序的開發(fā)效率。(4)當(dāng)文件名用雙引號括起來時,系統(tǒng)先在當(dāng)前目錄中尋找包含的文件,若找不到,再在系統(tǒng)指定的標(biāo)準(zhǔn)方式檢索其它目錄。而用尖括號時,系統(tǒng)直接按指定的標(biāo)準(zhǔn)方式檢索。一般系統(tǒng)提供的頭文件,用尖括號。自定義的文件,用雙引號。
(5)被包含文件與當(dāng)前文件,在預(yù)編譯后變成同一個文件,而非兩個文件。
(6)文件包含可以嵌套,但必須按順序包含。12.3條件編譯1.
#ifdef標(biāo)識符程序段1
#else
程序段2
#endif
若標(biāo)識符已經(jīng)被定義過,則對程序段1進(jìn)行編譯,否則對程序段2進(jìn)行編譯。和if-else語句一樣,#else子句可以缺省,缺省后的形式為:
#ifdef標(biāo)識符程序段1#endif還可增加#elif子句構(gòu)成嵌套。(2)#ifndef標(biāo)識符程序段1#else
程序段2#endif
與第一種形式正好相反,若標(biāo)識符未被定義過,則對程序段1進(jìn)行編譯,否則對程序段2進(jìn)行編譯。3.#if表達(dá)式程序段1
#else
程序段2
#endif
當(dāng)表達(dá)式之值為真(非零)時,編譯程序段1,否則編譯程序段2。例如:#ifDEBUG==1
調(diào)試代碼#endif
例12—3
根據(jù)給定的條件編譯,使給定的字符串以小寫字母或大寫字母形式輸出。
/*程序12—3,條件編譯實例*/
#defineLETTER1main()
{inti=0;
char*str=″HuNanComputer″;
charc;
while((c=str[i])!=′\0′)
{#ifLETTERif(c>=′a′&&c<=′z′)
c-=32;#elseif(c>=′A′&&c<=′Z′)
c+=32;#endif;
printf(″c%″,c);
}}運行結(jié)果:HUNANCOMPUTER
如將LETTER定義為0,將編譯另一條if語句,運行結(jié)果將變?yōu)椋篽unancomputer。
例12—4
假設(shè)某程序使用與國別有關(guān)的信息,每個國家的信息存于一頭文件中,采用條件編譯識別與國別有關(guān)的信息。#ifCHINA==1#include″china.h″#elifUSA==1#include″usa.h″#elifENGLAND==1#include″england.h″#elifFRANCE==1#include″france.h″#else#include″italy.h″#endif12.4圖形處理12.4.1圖形處理流程最簡單的圖形處理可以借用文本方式完成,而真正的圖形處理要進(jìn)入圖形工作方式。圖形處理的第一步是初始化,可通過調(diào)用initgraph()函數(shù)完成;初始化后就可調(diào)用相應(yīng)的圖形處理函數(shù)繪圖;處理完成調(diào)用closegraph()函數(shù)關(guān)閉圖形模式,退出圖形處理。
初始化函數(shù)原型為:
voidinitgraph(int*gdriver,int*gmode,char*pdrive);
(1)參數(shù)gdriver:圖形驅(qū)動程序的地址值。*gdriver取值為0~10,與對應(yīng)的顯卡關(guān)系為:0—DETECT(自動檢測)、1—CGA、3—EGA、9—VGA、……,一般選0即可。
(2)參數(shù)gmode:圖形處理模式。*gmode取值為0~5,具體取值與顯卡有關(guān)。在VGA顯卡下:0—640×200像素、1—640×350像素、2—640×480像素、……,詳細(xì)情況請參考相關(guān)手冊。(3)參數(shù)pdrive:圖形驅(qū)動程序BGI文件的路徑。初始化成功后,函數(shù)intgraphresult()返回0。圖形處理完畢后,需調(diào)用函數(shù)closegraph()關(guān)閉圖形模式。2.4.2圖形處理函數(shù)圖形處理函數(shù)包含在頭文件graphics.h中。這里介紹幾個基本處理函數(shù),更多的圖形處理函數(shù)可參見附錄C。
(1)顏色設(shè)置函數(shù):
voidsetcolor(intcolor);
(2)背景顏色設(shè)置函數(shù):
voidsetbkcolor(intcolor);
color取值與顏色的主要關(guān)系為:0—BLACK、1—BLUE、2—GREEN、4—RED、14—YELLOW、15—WHITE。(3)獲取當(dāng)前x坐標(biāo):
intgetx();(4)獲取當(dāng)前y坐標(biāo):
intgety();(5)畫線函數(shù):
voidline(intx1,inty1,intx2,inty2);其中:(x1,y1)與(x2,y2)為要畫線的端點。(6)畫圓函數(shù):
voidcricle(intx,inty,intr);其中:(x,y)為要畫圓的圓心,r為要畫圓的半徑。
(7)畫弧函數(shù):
voidarc(intx,inty,inta1,inta2,intr);其中:(x,y)為要畫弧的中心,a1、a2分別為弧的開始角和終止角。
例12-5
在屏幕上畫10條不同顏色的線和10個不同顏色的圓。程序如下:/*例12-5,畫線和圓*/#include"graphics.h"main(){inti,x,y,r;
intgdriver=DETECT,gmode;
/*初始化*/initgraph(&gdriver,&gmode,"C:\TC\BGI");
/*畫10條不同顏色的線*/for(i=1;i<=10;i++){setcolor(i);
line(10*i,i,400,400);
}/*畫10個不同顏色的圓*/for(i=1;i<=10;i++){setcolor(i);
cricle(100*i,100*i,100);
}}習(xí)題十二1.寫出下面的程序經(jīng)宏展開后的源程序,并寫出程序的運行結(jié)果。#definePRprintf("sum=%d\n",sum)#defineADDsum+=imain(){inti,sum=0;for(i=10;i<20;i++)ADD;
PR;}2.定義一個宏,用于判斷某年是否為閏年。
3.定義一個宏,求一元二次方程根的判別式的值。
4.根據(jù)個人習(xí)慣,定義一組自己常用的輸入/輸出格式宏,并存入一個文件中,然后設(shè)計一程序加以驗證。
5.用宏定義方式說明數(shù)組的類型及大小,編寫輸出a[0]至a[7]數(shù)組元素值的程序。假設(shè)a[0]='C'、a[1]='H'
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030年中國鋁板幕墻行業(yè)運行態(tài)勢及發(fā)展風(fēng)險分析報告
- 2025-2030年中國辣椒色素市場發(fā)展趨勢及前景調(diào)研分析報告
- 2025-2030年中國純銀首飾市場運行狀況及發(fā)展趨勢分析報告
- 2025-2030年中國硅藻土行業(yè)運行現(xiàn)狀及發(fā)展前景分析報告
- 2025-2030年中國畜禽養(yǎng)殖中抗生素行業(yè)發(fā)展?fàn)顩r及投資戰(zhàn)略研究報告
- 2025年堆垛機設(shè)備訂購合同
- 2025年基礎(chǔ)設(shè)施建設(shè)項目招標(biāo)合同樣本
- 投資公司委托投資合同范本
- 電視欄目合作制作合同與電視監(jiān)控工程安裝合同8篇
- 生涯規(guī)劃與就業(yè)創(chuàng)業(yè)全套課件電子教案板
- 湘少版六年級英語下冊《全冊課件》
- 2024-2030年中國護眼臺燈行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略分析報告
- 《土壤肥料學(xué)通論》課程教學(xué)大綱
- 第十四屆全國交通運輸行業(yè)職業(yè)技能競賽(公路收費及監(jiān)控員)賽項題庫-下(多選題-共3部分-2)
- 集合功能的測定(雙眼視檢查)
- 2024年農(nóng)村自建房裝修合同
- 2024年《高等教育心理學(xué)》考前輔導(dǎo)必背習(xí)題庫(300題)
- 2024年江蘇農(nóng)牧科技職業(yè)學(xué)院單招職業(yè)適應(yīng)性測試題庫完美版
- 2024年廣西職業(yè)院校技能大賽中職組《智慧物流作業(yè)》模塊MC競賽樣題
- 人事專員簡歷模板
評論
0/150
提交評論