




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第12章 編譯預(yù)處理,12.1 了解編譯預(yù)處理 12.2 宏 定 義 12.3 文 件 包 含 12.4 條 件 編 譯,12.1 了解編譯預(yù)處理,C語言所提供的“編譯預(yù)處理”功能是它區(qū)別于其他高級語言的又一重要特征,其主要功能包括三種:宏定義、文件包含和條件編譯,分別由三種命令來實(shí)現(xiàn)。為了區(qū)別于C語句,預(yù)處理命令必須出現(xiàn)在一行的開始并以“#”號打頭。,12.2 宏 定 義,宏定義由#define命令實(shí)現(xiàn),根據(jù)實(shí)際應(yīng)用的需要可以分為不帶參數(shù)的宏定義和帶有參數(shù)的宏定義兩種命令形式。 12.2.1 不帶參數(shù)的宏定義 命令的一般形式為: #define 標(biāo)識符 字符串,定義中的“標(biāo)識符”稱為“宏名”
2、。這一命令的作用僅僅是表明用指定的宏名來代替一個指定的字符串。例如: #define PI 3 .1415926 它的作用是指定用宏名PI來代替“3 .1415926”這個字符串。在預(yù)編譯時,程序中所有出現(xiàn)“宏名”的地方,都將由這個字符串的內(nèi)容進(jìn)行替換,此過程稱為“宏展開”。,說明 (1)不帶參數(shù)的宏定義常常被用于定義符號常量。這樣既可以提高程序的通用性,也便于修改。 例12.1 用宏名限定數(shù)組的大小。 #define N 10 /* 定義宏名N */ void ArrIn(int a) int i;,for(i=0; iN; i+) /* 為N個元素賦值 */ scanf(%d, ,以上是我
3、們在編程中常用的方法:首先利用宏定義指定用N代表字符串10;所以主函數(shù)中定義的數(shù)組大小是10;函數(shù)ArrIn中讀入的元素個數(shù)也是10。當(dāng)需要改變數(shù)組大小時,只需改動#define命令行,而不用改動程序的其他部分。 (2)宏展開時系統(tǒng)不作語法檢查,若定義不當(dāng),要待編譯展開源程序時,才會引發(fā)錯誤。,例如: #define PI 3.141592b main( ) float s, r=2.5; s=PI*r*r; printf(s=%fn,s); ,程序中在定義代表值的宏名PI時,將字符串3.1415926中的數(shù)字6誤寫作了字母b。這一宏定義命令本身并不構(gòu)成錯誤。因?yàn)楹昝鸓I代表的是字符串“3.1
4、41592b”,而不是數(shù)值。但在程序中引用了宏名PI來計算圓面積,賦值語句: s=PI*r*r;,經(jīng)宏展開后變?yōu)椋?s=3.141592b*r*r; 從而導(dǎo)致編譯出錯。雖然出錯位置在此賦值語句,但引發(fā)這一錯誤的根源還是上述宏定義命令。,(3)宏展開時,不對雙引號括起來的字符串中的內(nèi)容進(jìn)行替換。如有定義: #define PI 3.14159 語句:printf(PI=%fn,PI);中有2個PI,第一個PI是在雙引號內(nèi)的,它不被替換;第二個PI在雙引號外,它將被展開成3.14159。,(4)在#define命令行中可以沒有“字符串”,即表示成: #define 標(biāo)識符 如: #define D
5、EBUG 這里僅僅是為了表明標(biāo)識符DEBUG已經(jīng)“被定義”。這種定義形式在條件編譯中將會用到。,(5)為了與變量名相區(qū)別,一般習(xí)慣用大寫字母作宏名。但這不是規(guī)定,只是約定俗成。,12.2.2 帶參數(shù)的宏定義 1定義形式 #define 宏名(形參表) 字符串 例如: #define CYC(r) 2*3.14159*r,說明 (1)這里定義了一個計算圓周長的宏CYC(r),宏名CYC與其后的左括號之間不得留有空格,否則CYC將被視為不帶參數(shù)的宏。 (2)作為替換文本的字符串中應(yīng)含有括號中的參數(shù),如2*3.14159*r中的r。否則,就沒有必要定義帶參數(shù)的宏。,(3)字符串中可以包含已經(jīng)定義過的
6、宏名。例如: #define CR n #define D %d #define PRI D CR 則語句:printf(PRI, 20);執(zhí)行后的輸出結(jié)果為:20。,2宏展開的過程 程序中若調(diào)用了帶參數(shù)的宏,預(yù)編譯時不僅僅是進(jìn)行簡單的字符串替換,還涉及到參數(shù)的替換。宏展開的過程是:按命令行中指定的字符串從左到右進(jìn)行置換,遇到形參則以實(shí)參代替,對于非參數(shù)字符則原樣保留。若有語句:,x=CYC(2.5); 宏展開時將用實(shí)參2.5替換字符串“2*3.14159*r”中的形參r,其他字符不變。置換后的語句為: x=2*3.14159*2.5;,說明 (1)由于宏定義是在預(yù)編譯時展開的,它不具有任何計
7、算功能。宏展開時,若實(shí)參是一個表達(dá)式,也是原樣置換,而不進(jìn)行求值。如有語句: 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)用的正確性,在定義宏時,應(yīng)將字符串中的形參用括號括起來。例如: #define CYC(r) 2*3.14159*(r) 這時將語句y=CYC(3+5);展開后為: y=2*3.14159*(3+5); 有時還需要在整個字符串外面加括號。如對于以下定義的計算兩數(shù)之和的宏:,#define ADD(x
8、,y) x+y 若宏調(diào)用形式為: k=2*ADD(3,4); 展開后為: k=2*3+4; 顯然與設(shè)計意圖不符,這時宏定義應(yīng)改寫作: #define ADD(x,y) (x+y),3帶參數(shù)的宏與函數(shù)的主要區(qū)別 通過前面的舉例,讀者可能會覺得:在定義宏時有形參,通過宏調(diào)用給出實(shí)參,這種形式與函數(shù)的使用十分相似。事實(shí)上,它們是有本質(zhì)不同的。主要體現(xiàn)在以下幾方面。,(1)函數(shù)調(diào)用是在程序執(zhí)行過程中進(jìn)行的,要占用系統(tǒng)運(yùn)行時間;宏展開是在預(yù)編譯時進(jìn)行的,不占用系統(tǒng)運(yùn)行時間。 (2)函數(shù)調(diào)用時,要為形參開辟臨時單元,有值的傳遞和返回;宏定義和宏展開時都不需要開辟內(nèi)存單元,也沒有值的傳遞和返回。,(3)函數(shù)調(diào)用時,作為實(shí)參的表達(dá)式是經(jīng)過計算求值后傳給形參的,因此要求實(shí)參和形參類型一致;而宏展開只是進(jìn)行相應(yīng)的參數(shù)及字符替換,并不對實(shí)參求值,所以不存在類型問題。 (4)宏展開會使源程序代碼增長;而函數(shù)調(diào)用不影響源程序。 讀者可根據(jù)上述帶參數(shù)的宏與函數(shù)的區(qū)別,決定實(shí)際應(yīng)用時的選取。,12.3 文 件 包 含,文件包含由#include命令實(shí)現(xiàn),前面的章節(jié)中已多次出現(xiàn)。這一命令的一般形式為: #include 文件名 或 #includ
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 中國皮革模切機(jī)行業(yè)發(fā)展?jié)摿︻A(yù)測及投資策略研究報告
- 2025年職業(yè)教育行業(yè)洞察報告及未來五至十年預(yù)測分析報告
- 健康睡眠知識講座課件
- 健康活動托班課件下載
- 蔬菜市場供應(yīng)鏈管理辦法
- 街道老年代步車管理辦法
- 2024年食品、飲料及煙草批發(fā)服務(wù)項(xiàng)目資金申請報告代可行性研究報告
- 西安市中介管理辦法細(xì)則
- 西青區(qū)企業(yè)注冊管理辦法
- 證券市場綠色化管理辦法
- 漏肩風(fēng)(肩周炎)中醫(yī)臨床路徑及入院標(biāo)準(zhǔn)2020版
- 光面爆破知識講座課件
- 工程結(jié)構(gòu)檢測鑒定與加固第1章工程結(jié)構(gòu)檢測鑒定與加固概論課件
- 高鐵站裝飾裝修方案
- DB4401-T 112.1-2021 城市道路占道施工交通組織和安全措施設(shè)置+第1部分:交通安全設(shè)施設(shè)置-(高清現(xiàn)行)
- 質(zhì)量整改通知單(樣板)
- 杭州市高級中學(xué)2022年高一新生素質(zhì)測試(分班考)模擬試卷
- 《碳纖維片材加固混凝土結(jié)構(gòu)技術(shù)規(guī)程》(2022年版)
- 短視頻:策劃+拍攝+制作+運(yùn)營課件(完整版)
- 預(yù)制場(梁場)建設(shè)方案
- 專業(yè)課程融入思政工作的教學(xué)設(shè)計理念與方法(課堂PPT)
評論
0/150
提交評論