編譯預(yù)處理課件_第1頁(yè)
編譯預(yù)處理課件_第2頁(yè)
編譯預(yù)處理課件_第3頁(yè)
編譯預(yù)處理課件_第4頁(yè)
編譯預(yù)處理課件_第5頁(yè)
已閱讀5頁(yè),還剩19頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

編譯預(yù)處理12.1宏定義9.1.1不帶參數(shù)的宏定義

定義形式:#define

宏名宏體宏名是一自定義標(biāo)識(shí)符,宏體是一字符串,在程序中可用宏名代表宏體。

例如,用PI代表3.1415926,用PR代表printf,宏定義如下:

(1)#definePI3.1415926

(2)#defineePRprintf

程序中凡是出現(xiàn)3.1415926的地方,都可以以PI出現(xiàn),凡是出現(xiàn)printf的地方,都可以以PR出現(xiàn)。例9-1

利用宏定義求圓的周長(zhǎng)和面積。/*程序9-1,利用宏定義求圓的周長(zhǎng)和面積*/

#definePI3.1415926

#defineR1.0

main(){floatl,s;l=2.0*PI*R;s=PI*R*R;printf(″周長(zhǎng)=%f,面積=%f\n″,l,s);}

上面程序在編譯前將進(jìn)行宏展開(kāi),宏展開(kāi)以后變?yōu)椋?/p>

main()

{floatl,s;

l=2.0*3.1415926*1.0;

s=3.1415926*1.0*1.0;

printf(″周長(zhǎng)=%f,面積=%f\n″,l,s);

}(1)宏名一般習(xí)慣用大寫字母表示,以便與變量名相區(qū)別。當(dāng)然可以使用小寫字母。

(2)宏定義是用宏名簡(jiǎn)單替換宏體,也就是作簡(jiǎn)單的置換,不作語(yǔ)法檢查,出現(xiàn)錯(cuò)誤也不會(huì)報(bào)告,只有在宏展開(kāi)后編譯時(shí)才會(huì)報(bào)告錯(cuò)誤。

(3)程序中雙引號(hào)中與宏名相同的內(nèi)容不被替換。

(4)宏展開(kāi)后源程序?qū)⒆冮L(zhǎng)。

(5)使用宏名,可以減少程序中重復(fù)書(shū)寫某些宏體的工作量。

(6)宏定義一般放在程序的開(kāi)頭,宏名的有效范圍為定義位置到文件結(jié)束。

(7)宏定義可以嵌套,后定義的宏可使用已定義的宏。9.1.2帶參數(shù)的宏定義

定義形式:#define宏名(參數(shù)表)宏體帶參數(shù)的宏展開(kāi)時(shí)要從左至右進(jìn)行參數(shù)的簡(jiǎn)單替換,使用起來(lái)較無(wú)參數(shù)宏定義復(fù)雜。例如:

(1)#defineS(n)(n)*(n)*(n)

(2)#defineT(n)1/(n)第一個(gè)式子代表n的立方,第二個(gè)式子代表n的倒數(shù)。

說(shuō)明:

(1)列出的參數(shù)必須在宏體中用到。

(2)帶參數(shù)的宏展開(kāi)只是將實(shí)參簡(jiǎn)單替換形參。當(dāng)實(shí)參中含有運(yùn)算,宏展開(kāi)可能會(huì)出問(wèn)題。如有宏定義:#defineS(n)n*n*n

若將形參n用實(shí)參a+b替換,S(a+b)會(huì)變成a+b*a+b*a+b,顯然與原意不相符。如將宏定義改成:#defineS(n)(n)*(n)*(n)S(a+b)為(a+b)*(a+b)*(a+b),與原意相符。因此,在帶參的宏定義中,參數(shù)應(yīng)加括號(hào)來(lái)描述。(3)宏定義時(shí),在宏名與帶參數(shù)的括號(hào)之間不應(yīng)加空格,否則將空格以后的部分都作為宏體。例如:#defineS(n)(n)*(n)*(n)

S被認(rèn)為是不帶參數(shù)的宏名,它代表(n)(n)*(n)*(n)這樣的宏體。

(4)如在宏體中的參數(shù)前加上“#”,則在宏展開(kāi)后該實(shí)參前后會(huì)加上雙引號(hào),變成字符串。例9–2

利用帶參數(shù)的宏定義求圓的周長(zhǎng)和面積/*程序9-2,利用帶參數(shù)的宏定義求圓的周長(zhǎng)和面積*/#defineR1.0

#definePI3.14159

#defineC(r)2*PI*(r)#defineS(r)PI*(r)*(r)main(){printf(″周長(zhǎng)=%f,面積=%f\n″,C(R),S(R));}

上面程序宏展開(kāi)后如下:main(){printf(″周長(zhǎng)=%f,面積=%f\n″,2*3.14159*1.0,3.14159*1.0*1.0);}

帶參數(shù)的宏又稱為函數(shù)宏,函數(shù)宏不是函數(shù):

(1)函數(shù)調(diào)用要求形參和實(shí)參類型一致,如實(shí)參是表達(dá)式,必須先計(jì)算出值;宏名無(wú)類型,宏體也無(wú)類型,宏展開(kāi)只進(jìn)行參數(shù)的簡(jiǎn)單替換。

(2)函數(shù)調(diào)用是在程序運(yùn)行時(shí)處理,分配臨時(shí)的內(nèi)存單元,有返回值;而宏展開(kāi)是在編譯前進(jìn)行的,展開(kāi)時(shí)并不分配內(nèi)存單元,不進(jìn)行值的傳遞,沒(méi)有返回值的概念。

(3)調(diào)用函數(shù)得到一個(gè)返回值,而用宏則可以設(shè)法得到幾個(gè)值。

(4)宏展開(kāi)將使源程序變長(zhǎng),而函數(shù)調(diào)用不使源程序變長(zhǎng)

(5)宏替換不占運(yùn)行時(shí)間,只占編譯時(shí)間,而函數(shù)調(diào)用則占運(yùn)行時(shí)間(分配單元、保留現(xiàn)場(chǎng)、值傳遞、返回)。9.1.3預(yù)定義宏

預(yù)定義宏,由系統(tǒng)提供,宏名開(kāi)始和結(jié)尾均為下劃線。

-TURBOC-,當(dāng)前TURBOC的版本號(hào)。

-LINE-,程序行號(hào),第一行定義為1。

-FILE-,源程序文件名。

-DATE-,當(dāng)前編譯日期。

-TIME-,當(dāng)前編譯時(shí)間。9.1.4取消宏定義

形式:#undef宏名取消前面定義的宏名,使宏名局部化,取消以后不能再使用。9.2文件包含

文件包含是指一個(gè)C語(yǔ)言源程序中將另一個(gè)C語(yǔ)言源程序包含進(jìn)來(lái),通過(guò)include預(yù)處理指令實(shí)現(xiàn)。一般形式:#include″被包含文件名″

或#include<被包含文件名>

(1)被包含的文件一般指定為頭文件(*.h),也可為C程序等文件。

(2)一個(gè)include指令只能指定一個(gè)被包含文件,如果要包含n個(gè)文件,則要用到n條include指令。

(3)不能包含OBJ文件。文件包含是在編譯前進(jìn)行處理,不是在連接時(shí)進(jìn)行處理。(4)當(dāng)文件名用雙引號(hào)括起來(lái)時(shí),系統(tǒng)先在當(dāng)前目錄中尋找包含的文件,若找不到,再在系統(tǒng)指定的標(biāo)準(zhǔn)方式檢索其它目錄。而用尖括號(hào)時(shí),系統(tǒng)直接按指定的標(biāo)準(zhǔn)方式檢索。一般系統(tǒng)提供的頭文件,用尖括號(hào)。自定義的文件,用雙引號(hào)。

(5)被包含文件與當(dāng)前文件,在預(yù)編譯后變成同一個(gè)文件,而非兩個(gè)文件。

(6)文件包含可以嵌套,但必須按順序包含。9.3條件編譯1.

#ifdef標(biāo)識(shí)符程序段1

#else

程序段2

#endif

當(dāng)標(biāo)識(shí)符已經(jīng)被定義過(guò),則對(duì)程序段1進(jìn)行編譯,否則對(duì)程序段2進(jìn)行編譯。和if-else語(yǔ)句一樣,#else子句可以缺省,缺省后的形式為:#ifdef標(biāo)識(shí)符程序段1

#endif

另可增加#elif子句構(gòu)成嵌套。2.#ifndef標(biāo)識(shí)符

程序段1

#else

程序段2

#endif

與第一種形式正好相反,當(dāng)標(biāo)識(shí)符未被定義過(guò)時(shí),則對(duì)程序段1進(jìn)行編譯,否則,對(duì)程序段2進(jìn)行編譯。3.#if表達(dá)式程序段1

#else

程序段2

#endif

當(dāng)表達(dá)式之值為真(非零)時(shí),編譯程序段1,否則編譯程序段2。例如:#ifDEBUG==1

調(diào)試代碼#endif

例9—3

根據(jù)給定的條件編譯,使給定的字符串以小寫字母或大寫字母形式輸出。

/*程序9—3,條件編譯實(shí)例*/

#defineLETTER1

main()

{inti=0;

char*str=″HuNanComputer″;

charc;

while((c=str[i])!=′\0′)

{#ifLETTER

if(c>=′a′&&c<=′z′)

c-=32;#else

if(c>=′A′&&c<=′Z′)

c+=32;#endif;

printf(″c%″,c);}

}運(yùn)行結(jié)果:HUNANCOMPUTER

如將LETTER定義為0,將編譯另一條if語(yǔ)句,運(yùn)行結(jié)果將變?yōu)椋篽unancomputer。

例9—4

假設(shè)某程序使用與國(guó)別有關(guān)的信息,每個(gè)國(guó)

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論