C語(yǔ)言程序設(shè)計(jì)教程 第12章 編譯預(yù)處理.ppt_第1頁(yè)
C語(yǔ)言程序設(shè)計(jì)教程 第12章 編譯預(yù)處理.ppt_第2頁(yè)
C語(yǔ)言程序設(shè)計(jì)教程 第12章 編譯預(yù)處理.ppt_第3頁(yè)
C語(yǔ)言程序設(shè)計(jì)教程 第12章 編譯預(yù)處理.ppt_第4頁(yè)
C語(yǔ)言程序設(shè)計(jì)教程 第12章 編譯預(yù)處理.ppt_第5頁(yè)
已閱讀5頁(yè),還剩22頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第12章 編譯預(yù)處理,12.1 了解編譯預(yù)處理 12.2 宏 定 義 12.3 文 件 包 含 12.4 條 件 編 譯,12.1 了解編譯預(yù)處理,C語(yǔ)言所提供的“編譯預(yù)處理”功能是它區(qū)別于其他高級(jí)語(yǔ)言的又一重要特征,其主要功能包括三種:宏定義、文件包含和條件編譯,分別由三種命令來(lái)實(shí)現(xiàn)。為了區(qū)別于C語(yǔ)句,預(yù)處理命令必須出現(xiàn)在一行的開(kāi)始并以“#”號(hào)打頭。,12.2 宏 定 義,宏定義由#define命令實(shí)現(xiàn),根據(jù)實(shí)際應(yīng)用的需要可以分為不帶參數(shù)的宏定義和帶有參數(shù)的宏定義兩種命令形式。 12.2.1 不帶參數(shù)的宏定義 命令的一般形式為: #define 標(biāo)識(shí)符 字符串,定義中的“標(biāo)識(shí)符”稱(chēng)為“宏名”

2、。這一命令的作用僅僅是表明用指定的宏名來(lái)代替一個(gè)指定的字符串。例如: #define PI 3 .1415926 它的作用是指定用宏名PI來(lái)代替“3 .1415926”這個(gè)字符串。在預(yù)編譯時(shí),程序中所有出現(xiàn)“宏名”的地方,都將由這個(gè)字符串的內(nèi)容進(jìn)行替換,此過(guò)程稱(chēng)為“宏展開(kāi)”。,說(shuō)明 (1)不帶參數(shù)的宏定義常常被用于定義符號(hào)常量。這樣既可以提高程序的通用性,也便于修改。 例12.1 用宏名限定數(shù)組的大小。 #define N 10 /* 定義宏名N */ void ArrIn(int a) int i;,for(i=0; iN; i+) /* 為N個(gè)元素賦值 */ scanf(%d, ,以上是我

3、們?cè)诰幊讨谐S玫姆椒ǎ菏紫壤煤甓x指定用N代表字符串10;所以主函數(shù)中定義的數(shù)組大小是10;函數(shù)ArrIn中讀入的元素個(gè)數(shù)也是10。當(dāng)需要改變數(shù)組大小時(shí),只需改動(dòng)#define命令行,而不用改動(dòng)程序的其他部分。 (2)宏展開(kāi)時(shí)系統(tǒng)不作語(yǔ)法檢查,若定義不當(dāng),要待編譯展開(kāi)源程序時(shí),才會(huì)引發(fā)錯(cuò)誤。,例如: #define PI 3.141592b main( ) float s, r=2.5; s=PI*r*r; printf(s=%fn,s); ,程序中在定義代表值的宏名PI時(shí),將字符串3.1415926中的數(shù)字6誤寫(xiě)作了字母b。這一宏定義命令本身并不構(gòu)成錯(cuò)誤。因?yàn)楹昝鸓I代表的是字符串“3.1

4、41592b”,而不是數(shù)值。但在程序中引用了宏名PI來(lái)計(jì)算圓面積,賦值語(yǔ)句: s=PI*r*r;,經(jīng)宏展開(kāi)后變?yōu)椋?s=3.141592b*r*r; 從而導(dǎo)致編譯出錯(cuò)。雖然出錯(cuò)位置在此賦值語(yǔ)句,但引發(fā)這一錯(cuò)誤的根源還是上述宏定義命令。,(3)宏展開(kāi)時(shí),不對(duì)雙引號(hào)括起來(lái)的字符串中的內(nèi)容進(jìn)行替換。如有定義: #define PI 3.14159 語(yǔ)句:printf(PI=%fn,PI);中有2個(gè)PI,第一個(gè)PI是在雙引號(hào)內(nèi)的,它不被替換;第二個(gè)PI在雙引號(hào)外,它將被展開(kāi)成3.14159。,(4)在#define命令行中可以沒(méi)有“字符串”,即表示成: #define 標(biāo)識(shí)符 如: #define D

5、EBUG 這里僅僅是為了表明標(biāo)識(shí)符DEBUG已經(jīng)“被定義”。這種定義形式在條件編譯中將會(huì)用到。,(5)為了與變量名相區(qū)別,一般習(xí)慣用大寫(xiě)字母作宏名。但這不是規(guī)定,只是約定俗成。,12.2.2 帶參數(shù)的宏定義 1定義形式 #define 宏名(形參表) 字符串 例如: #define CYC(r) 2*3.14159*r,說(shuō)明 (1)這里定義了一個(gè)計(jì)算圓周長(zhǎng)的宏CYC(r),宏名CYC與其后的左括號(hào)之間不得留有空格,否則CYC將被視為不帶參數(shù)的宏。 (2)作為替換文本的字符串中應(yīng)含有括號(hào)中的參數(shù),如2*3.14159*r中的r。否則,就沒(méi)有必要定義帶參數(shù)的宏。,(3)字符串中可以包含已經(jīng)定義過(guò)的

6、宏名。例如: #define CR n #define D %d #define PRI D CR 則語(yǔ)句:printf(PRI, 20);執(zhí)行后的輸出結(jié)果為:20。,2宏展開(kāi)的過(guò)程 程序中若調(diào)用了帶參數(shù)的宏,預(yù)編譯時(shí)不僅僅是進(jìn)行簡(jiǎn)單的字符串替換,還涉及到參數(shù)的替換。宏展開(kāi)的過(guò)程是:按命令行中指定的字符串從左到右進(jìn)行置換,遇到形參則以實(shí)參代替,對(duì)于非參數(shù)字符則原樣保留。若有語(yǔ)句:,x=CYC(2.5); 宏展開(kāi)時(shí)將用實(shí)參2.5替換字符串“2*3.14159*r”中的形參r,其他字符不變。置換后的語(yǔ)句為: x=2*3.14159*2.5;,說(shuō)明 (1)由于宏定義是在預(yù)編譯時(shí)展開(kāi)的,它不具有任何計(jì)

7、算功能。宏展開(kāi)時(shí),若實(shí)參是一個(gè)表達(dá)式,也是原樣置換,而不進(jìn)行求值。如有語(yǔ)句: y=CYC(3+5);,這里用實(shí)參3+5替換“2*3.14159*r”中的形參r后得到: y=2*3.14159*3+5; 而不是: y=2*3.14159*8; /* 3和5不能先做加法運(yùn)算 */,(2)顯然,為確保宏調(diào)用的正確性,在定義宏時(shí),應(yīng)將字符串中的形參用括號(hào)括起來(lái)。例如: #define CYC(r) 2*3.14159*(r) 這時(shí)將語(yǔ)句y=CYC(3+5);展開(kāi)后為: y=2*3.14159*(3+5); 有時(shí)還需要在整個(gè)字符串外面加括號(hào)。如對(duì)于以下定義的計(jì)算兩數(shù)之和的宏:,#define ADD(x

8、,y) x+y 若宏調(diào)用形式為: k=2*ADD(3,4); 展開(kāi)后為: k=2*3+4; 顯然與設(shè)計(jì)意圖不符,這時(shí)宏定義應(yīng)改寫(xiě)作: #define ADD(x,y) (x+y),3帶參數(shù)的宏與函數(shù)的主要區(qū)別 通過(guò)前面的舉例,讀者可能會(huì)覺(jué)得:在定義宏時(shí)有形參,通過(guò)宏調(diào)用給出實(shí)參,這種形式與函數(shù)的使用十分相似。事實(shí)上,它們是有本質(zhì)不同的。主要體現(xiàn)在以下幾方面。,(1)函數(shù)調(diào)用是在程序執(zhí)行過(guò)程中進(jìn)行的,要占用系統(tǒng)運(yùn)行時(shí)間;宏展開(kāi)是在預(yù)編譯時(shí)進(jìn)行的,不占用系統(tǒng)運(yùn)行時(shí)間。 (2)函數(shù)調(diào)用時(shí),要為形參開(kāi)辟臨時(shí)單元,有值的傳遞和返回;宏定義和宏展開(kāi)時(shí)都不需要開(kāi)辟內(nèi)存單元,也沒(méi)有值的傳遞和返回。,(3)函數(shù)調(diào)用時(shí),作為實(shí)參的表達(dá)式是經(jīng)過(guò)計(jì)算求值后傳給形參的,因此要求實(shí)參和形參類(lèi)型一致;而宏展開(kāi)只是進(jìn)行相應(yīng)的參數(shù)及字符替換,并不對(duì)實(shí)參求值,所以不存在類(lèi)型問(wèn)題。 (4)宏展開(kāi)會(huì)使源程序代碼增長(zhǎng);而函數(shù)調(diào)用不影響源程序。 讀者可根據(jù)上述帶參數(shù)的宏與函數(shù)的區(qū)別,決定實(shí)際應(yīng)用時(shí)的選取。,12.3 文 件 包 含,文件包含由#include命令實(shí)現(xiàn),前面的章節(jié)中已多次出現(xiàn)。這一命令的一般形式為: #include 文件名 或 #includ

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論