版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、第8章編譯預處理,8.1宏定義 8.2文件包含 8.3條件編譯,8.1宏定義,在C語言源程序中,允許用一個標識符來表示一個字符串,稱為宏。被定義為宏的標識符稱為宏名。在編譯預處理時,對程序中所有出現(xiàn)的“宏名”,都用宏定義中的字符串去代換,這稱為“宏代換”或“宏展開”。宏分為無參宏和帶參宏。 1.無參宏 無參宏的宏名后不帶參數(shù)。其定義的一般形式為: #define標識符字符串其中“#define”表示這是一條宏定義預處理命令,“標識符”是所定義的宏名,“字符串”可以是常量、表達式和格式串等。,下一頁,返回,8.1宏定義,例8-1給定圓錐的底圓半徑R和高H,求圓錐的體積。 #define PI 3
2、.14159 #define R 5 #define H 6 #define CVPvolume of cone is: main( ) float v; v=PI*R*R*H/3.0; printf (%s %fn, cvp, v); ,上一頁,下一頁,返回,8.1宏定義,運行結果: volume of cone is: 157.079500 說明: 宏定義是用宏名來表示一個字符串,在宏展開時則以該字符串代換宏名,這只是一種簡單的替換。字符串中可含任何字符,預處理程序?qū)λ蛔魅魏螜z查。若有錯誤,只能在編譯已被宏展開后的源程序時發(fā)現(xiàn)。 宏定義不是說明或語句,在末尾不應加分號,否則連分號也一起代
3、換。,上一頁,下一頁,返回,8.1宏定義,宏定義必須寫在函數(shù)之外,其作用域為從宏定義命令開始到源程序結束。如要終止其作用域可使用預處理命令#undef。 宏名習慣上用大寫字母表示,以便與變量相區(qū)別。但也允許使用小寫字母。 宏名在源程序中若用雙引號括起來,則預處理程序不對其作宏代換。例如: #define PI 3.14159 main( ) printf(PI); printf(n); ,上一頁,下一頁,返回,8.1宏定義,則運行結果為: PI 這里把“PI”作為字符串處理,因此不作宏代換。 宏定義允許嵌套。 在宏定義的字符串中可以使用已經(jīng)定義的宏名。在宏展開時由預處理程序?qū)⒆鲗訉哟鷵Q。例如:
4、 #define WIDTH 80 #define LENGTH (WIDTH+40) 其中,第2個宏定義中使用了第1個宏定義中的宏名WIDTH。在執(zhí)行編譯處理時,將程序中的所有WIDTH都被80代換,而所有的LENGTH都被(80+40)代換。,上一頁,下一頁,返回,8.1宏定義,(7)可用宏定義表示數(shù)據(jù)類型。 例如:#define REAL float 這時可用REAL作單精度實型變量的說明: REAL e, f; 2.帶參宏 C語言允許宏帶有參數(shù)。在宏定義中的參數(shù)稱為形式參數(shù),在宏調(diào)用中的參數(shù)稱為實際參數(shù)。對帶參的宏,在調(diào)用中,不僅要宏展開,而且要用實參去代換形參。實參可以是表達式。 帶
5、參宏定義的一般形式為: #define宏名(形式參數(shù)表)字符串,上一頁,下一頁,返回,8.1宏定義,帶參宏調(diào)用的一般形式為: 宏名(實際參數(shù)表); 例如: #define POWER(x) (x)*(x) #define VOLUME(r,h) 3.14159*(r)*(r)*(h)/3.0 假設x=4; y=6; r=3; h=5; z=POWER(x+y); v=VOLUME(r+2, h+1);,上一頁,下一頁,返回,8.1宏定義,則經(jīng)編譯預處理宏展開后為: z=(x+y)*(x+y); v=3.14159*(r+2)*(r+2)*(h+1)/3.0; 說明: 帶參宏定義中,宏名與形參表
6、之間不能有空格。 例如:將帶參宏定義 #define POWER(x) (x)*(x) 改寫成:#define POWER (x) (x)*(x),上一頁,下一頁,返回,8.1宏定義,則被認為是無參宏定義,宏名POWER代表(x) (x)*(x),這顯然是錯誤的。 在帶參宏定義時,應適當加括號,以使意義明確。例如: #define AREA(r) 3.14159*(r)*(r) S=AREA(x+5); 宏調(diào)用時,用實參x+5去代替形參r,則宏展開后為: S=3.14159*(x+5)*(x+5); 若在宏定義時,r不加括號,即 #define AREA(r) 3.14159*r*r 則宏展開
7、后的語句為: S=3.14159*x+5*x+5; 因此,為了避免出錯,在宏定義中,字符串內(nèi)形參通常要用括號括起來。,上一頁,下一頁,返回,8.1宏定義,在帶參宏定義中,形參不分配內(nèi)存單元,因此不必作類型定義。而宏調(diào)用中的實參有具體值,要用它們代換形參,故必須作類型定義。這與函數(shù)不同,在函數(shù)中,形參是變量,有自己的作用域,調(diào)用時要把實參的值傳遞給形參。而在帶參宏調(diào)用時,只是符號代換,不存在值傳遞的問題。 在宏定義中的形參是標識符,而宏調(diào)用中的實參可以是表達式。 宏定義也可用來定義多個語句,在宏調(diào)用時,將這些語句代換到源程序中。,上一頁,下一頁,返回,8.1宏定義,例8-2試分析下列程序。 #d
8、efine PI 3.14159 #define COLUM(R,H,S,SC,V) S=PI*R*R; SC=2*PI*R*H; V=PI*R*R*H; main( ) float r,h,s,sc,v; printf (Enter r and h:); scanf (%f, %f, ,上一頁,下一頁,返回,8.1宏定義,經(jīng)編譯預處理,COLUM(r,h,s,sc,v)宏展開后為: s=PI*r*r; sc=2*PI*r*h; v=PI*r*r*h; 運行結果: Enter r and h: 2, 5 r=2.00, h=5.00, s=12.57, sc=62.83, v=62.83,上一
9、頁,返回,8.2文件包含,文件包含預處理命令的一般形式為: 格式1:#include 格式2:#include “文件名” 文件包含預處理命令的功能是把指定的文件的內(nèi)容插入在該命令行位置而取代該命令行,從而把指定的文件內(nèi)容和當前的源程序連成一個源文件。例如:#include 及#include math.h。 在程序設計中,文件包含是很有用的。一個大的程序通常劃分為多個模塊,由多個程序員分別編寫。有些公用的符號常量或宏定義等可單獨組成一個文件,在其他文件的開頭用文件包含命令將該文件包含進來即可使用。這樣,可避免重復書寫那些公用量,從而節(jié)省了時間,且減少出錯。,下一頁,返回,8.2文件包含,例8
10、-3將例8-2程序改寫為: 文件pcf.h define PI 3.14159 #define COLUM(R,H,S,SC,V) S=PI*R*R; SC=2*PI*R*H; V=PI*R*R*H; #define PR printf #define F r=%6.2f, h=%6.2f, s=%6.2f, sc=%6.2f, v=%6.2fn 文件tcp1.c #include pcf.h,上一頁,下一頁,返回,8.2文件包含,main( ) float r,h,s,sc,v; printf (Enter r and h:); scanf (%f,%f, ,上一頁,下一頁,返回,8.2文件
11、包含,說明: 文件包含命令中的文件名可以用尖括號括起,也可以用雙引號括起,這兩種形式是有區(qū)別的。使用尖括號表示在包含文件目錄中去查找指定的文件,而不在源文件目錄中去查找;使用雙引號則表示首先在當前的源文件目錄中查找指定的文件,若未找到再到包含文件目錄中去查找。 一個include命令只能指定一個被包含文件,若有多個文件要包含,要使用多個#include命令。 文件包含允許嵌套,即在一個被包含的文件中又可以包含另一個文件。,上一頁,返回,8.3條件編譯,在通常情況下,源程序中每一行都參加編譯。但有時希望對其中一部分內(nèi)容只在滿足一定條件時才進行編譯,這就是所謂“條件編譯”。 C語言的預處理程序提供
12、了條件編譯功能??砂床煌臈l件去編譯不同的程序部分,因而產(chǎn)生不同的目標代碼,這對于程序的移植和調(diào)試很有用。,下一頁,返回,8.3條件編譯,條件編譯有3種形式: 1.第1種形式 其一般形式為: 其功能是,若標識符已經(jīng)#define命令定義過,則對程序段1進行編譯;否則,若有程序段2,則對程序段2進行編譯;若無程序段2,則什么也不編譯。例如:,上一頁,下一頁,返回,8.3條件編譯,#define YES 1 main( ) #ifdef YES printf(a=%dn,a); #else printf(a=%Xn,a); #endif 程序中的條件編譯,若YES已被宏定義,則a以十進制整數(shù)輸出;
13、否則,a以十六進制整數(shù)輸出。,上一頁,下一頁,返回,8.3條件編譯,2. 第2種形式 其一般形式為: 其功能是,若標識符未被宏定義過,則對程序段1進行編譯;否則,若有程序段2,則對程序段2進行編譯;若無程序段2,則什么也不編譯。,上一頁,下一頁,返回,8.3條件編譯,3. 第3種形式 其一般形式為: 其功能是,若常量表達式的值為真(非0),則編譯程序段1,否則編譯程序段2。,上一頁,下一頁,返回,8.3條件編譯,例8-4輸入一行字母字符,根據(jù)需要設置條件編譯,使之能將字母全改為大寫輸出,或全改為小寫字母輸出。 #define LETTER 1 main( ) char str20=CLanguage,c; int i; i=0 while(c=stri)!=0) i+;,上一頁,下一頁,返回,8.3條件編譯,上一頁,下一頁,返回,8.3條件編譯, 運行結果為: CLANGUAGE 現(xiàn)在先定義LETTER為1,這樣在對條件編譯命令進行預處理時,由于LETTER為
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年大學信息工程(信號與線性系統(tǒng))試題及答案
- 2026年冰箱維修(制冷系統(tǒng)維修)試題及答案
- 2025年高職電子技術應用(電路調(diào)試)試題及答案
- 2025年中職美容(紋繡技術)試題及答案
- 2025年中職人工智能技術應用(AI圖像處理基礎)試題及答案
- 2025年高職(建筑裝飾工程技術)建筑裝飾預算試題及答案
- 2025年中職早期教育(嬰幼兒語言教育)試題及答案
- 2025年中職智能控制技術(智能控制基礎)試題及答案
- 2025年大學中醫(yī)學(中醫(yī)內(nèi)科研究)試題及答案
- 2025年大學機器人控制技術(編程)試題及答案
- 河道清淤作業(yè)安全組織施工方案
- 2026年七臺河職業(yè)學院單招職業(yè)技能測試題庫附答案
- 2021海灣消防 GST-LD-8318 緊急啟停按鈕使用說明書
- 煙花爆竹零售經(jīng)營安全責任制度
- 2023年和田地區(qū)直遴選考試真題匯編含答案解析(奪冠)
- ICG熒光導航在肝癌腹腔鏡解剖性肝切除中的應用2026
- 城市軌道交通服務與管理崗位面試技巧
- 江蘇徐州泉豐建設工程有限公司招聘筆試題庫2025
- 質(zhì)量、環(huán)境與職業(yè)健康安全管理方針與目標
- 學堂在線 雨課堂 學堂云 批判性思維-方法和實踐 章節(jié)測試答案
- 語音廳新人培訓課件
評論
0/150
提交評論