版權(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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度企業(yè)培訓(xùn)成果轉(zhuǎn)化與應(yīng)用合同3篇
- 二零二五年度出差人員差旅住宿補(bǔ)貼合同4篇
- 二零二五年度臨建場地臨時建筑安全防護(hù)與應(yīng)急預(yù)案合同4篇
- 二零二五版購房贈送全屋智能家居系統(tǒng)及精裝修合同4篇
- 2025年度鋁合金型材庫存管理與銷售合同范本
- 二零二五年度個人信用借款合同模板下載3篇
- 2025年度智能家居櫥柜定制合同模板2篇
- 2025年度瓷磚防滑處理及施工安全合同3篇
- 二零二五版國際工程承包合同英文翻譯及項目管理4篇
- 2025年度退股協(xié)議模板:新能源汽車產(chǎn)業(yè)股權(quán)退出合同
- 南通市2025屆高三第一次調(diào)研測試(一模)地理試卷(含答案 )
- 2025年上海市閔行區(qū)中考數(shù)學(xué)一模試卷
- 2025中國人民保險集團(tuán)校園招聘高頻重點提升(共500題)附帶答案詳解
- 重癥患者家屬溝通管理制度
- 法規(guī)解讀丨2024新版《突發(fā)事件應(yīng)對法》及其應(yīng)用案例
- 小學(xué)二年級數(shù)學(xué)口算練習(xí)題1000道
- 納布啡在產(chǎn)科及分娩鎮(zhèn)痛的應(yīng)用
- DZ/T 0462.4-2023 礦產(chǎn)資源“三率”指標(biāo)要求 第4部分:銅等12種有色金屬礦產(chǎn)(正式版)
- 化學(xué)-福建省龍巖市2024屆高三下學(xué)期三月教學(xué)質(zhì)量檢測(一模)試題和答案
- 凸優(yōu)化在經(jīng)濟(jì)學(xué)與金融學(xué)中的應(yīng)用
- 家譜、宗譜頒譜慶典講話
評論
0/150
提交評論