下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第九章 預(yù)編譯處理綜述編譯:(Alt+F9)對源程序進(jìn)行詞法和語法分析、優(yōu)化、生成目標(biāo)代碼等。編譯預(yù)處理(預(yù)編譯) :在編譯前為編譯做的準(zhǔn)備工作,這是由于預(yù)編譯命令的要求。C提供三方面的預(yù)處理(預(yù)編譯)功能: 宏定義 文件包含 條件編譯所有的預(yù)處理命令都是由#開頭。8.1 宏定義 不帶參數(shù)的宏定義一般形式:#define 標(biāo)識符 字符串例如:#define PI 3.14159注意:沒有分號其作用是把源程序中該定義后的所有“標(biāo)識符”(如PI)都用“字符串”(3.14159)替換。area=a*barea=3*2;2. 帶參數(shù)的宏定義(宏函數(shù))帶參數(shù)的宏不是簡單的字符串替換,還要進(jìn)行參數(shù)替換。定
2、義形式:#define 宏名(參數(shù)表)字符串例如:#define S(a, b) a*b area=S(3, 2); 帶參數(shù)的宏展開過程是:1)用字符串替換程序中的宏名。2)用實(shí)參替換字符串中的形參。返回 宏定義說明:1 習(xí)慣上宏名用大寫字母。2 宏定義是用宏名代替字符串,是簡單置換,不做語法檢查。如#define PI 3.14edf。語法上也是對的。3 宏定義不是語句,不加分號,因?yàn)榉痔栆矔蔀樘鎿Q的一部分。4 #define命令出現(xiàn)在程序中函數(shù)的外面,宏名的有效范圍是定義之后到本源文件結(jié)束。通常#define寫在文件開頭,函數(shù)之前。5 可以用#undef命令終止宏定義的作用域。6 在定義
3、宏時,可以引用已定義的宏名,層層置換。例:#include#define R 3.0#define PI 3.14159#define L 2*PI*R#define S PI*R*Rvoid main()printf(“L=%fnS=%fn”, L, S);7 對程序中用雙引號引起的顯式字符串即便和宏名相同也不進(jìn)行置換。8. 宏定義與變量定義不同,只做字符串替換,不占內(nèi)存單元。返回宏定義例題#include#define PI 3.1415926#define S(r) PI*r*rvoid main() float a, area; a=3.6; area=S(a); printf(“r=
4、%fnarea=%fn”, a, area);area=S(a);展開得結(jié)果是area=3.1415926*a*a;S(r)=PI*r*rArea=S(a)=PI*a*a=3.1415926*3.6*3.6說明:1 宏展開是簡單的替換,帶參數(shù)的宏同樣如此。#define S(r) PI*r*r area=S(a+b); area=PI*a+b*a+b; #define S(r) PI*(r)(r) area=S(a+b); area=PI*(a+b)*(a+b);2 在宏定義時,在宏名和參數(shù)的括弧間不應(yīng)加空格,否者系統(tǒng)會把括弧、參數(shù)及后面的字符串都理解為進(jìn)行替換的字符串。 #define S
5、(r) PI*r*r -作為字符串替換調(diào)用時,若宏名和參數(shù)的括弧間有空格area=S (a); 則,area= (r) PI*r*r (a)無參宏定義說明宏函數(shù)和普通函數(shù)機(jī)制上的不同:1 普通函數(shù)調(diào)用時,先求出實(shí)參表達(dá)式的值,再帶入形參;而宏函數(shù)只是進(jìn)行簡單替換。如:area=S(a+b); 如果S( )是普通函數(shù),先求出a+b的值再帶入形參; 如果S( )是宏,直接進(jìn)行a+b的替換。2 函數(shù)調(diào)用是在程序運(yùn)行時完成的,動態(tài)分配臨時內(nèi)存單元。宏展開則是在編譯時進(jìn)行的,在展開時并不分配內(nèi)存,不進(jìn)行值的傳遞處理,也沒有“返回值”的概念。內(nèi)存單元的分配也是運(yùn)行時完成的,回顧宏展開的過程便可理解。3 函
6、數(shù)中形參和實(shí)參要求類型一致,函數(shù)也有返回值類型,而宏定義中沒有任何類型問題,只是一個符號代表,展開時是簡單的替換。因?yàn)楹甓x中,宏名也應(yīng)理解為字符串。4 調(diào)用普通函數(shù)只可以得到一個返回值,而宏可以設(shè)法得到幾個結(jié)果。#define PI 3.1415926#define CIRCLE(R, L, S, V) L=2*PI*R; S=PI*R*R; V=4.0/3.0*PI*R*R*Rvoid main()float r, l, s, v;scanf(“%f”, &r);CIRCLE(r,l,s,v);printf(“r=%6.2f, l=%6.2f, v=%6.2fn”, r, l, s, v)
7、;宏CIRCLE(r, l, s, v);的過程是:1) L=2*PI*R; S=PI*R*R; V=4.0/3.0*PI*R*R*R 2) l=2*3.1415926*r; s=3.1415926*r*r; v=4.0/3.0*3.1415926*r*r*r;可以通過宏帶回l, s, v三個值。5 過多的宏,展開后源程序會變長,而函數(shù)調(diào)用不會使源程序變長。6 宏替換不占用運(yùn)行時間,只占用編譯時間。而函數(shù)調(diào)用占用較多的運(yùn)行時間(分配單元、保留現(xiàn)場-調(diào)用點(diǎn)的地址、值傳遞、返回)。一般來說,用宏代表簡單的表達(dá)式,而有些用宏和函數(shù)均可。#define MAX(x,y) (x)(y)?(x):(y)M
8、ain()int a,b,c,d,t;t=MAX(a+b,c+d);Int max(int x,int y)return(xy?x:y);Main()int a,b,c,d,t;t=max(a+b,c+d);展開后 t=(a+b)(c+d)?(a+b):(c+d)如果善于利用宏,可以使程序簡單化。#define PR printf #define NL n #define D %dt #define D1 D NL #define D2 D D NL #define D3 D D D NL #define D4 D D D D NL #define S %s #include void mai
9、n() int a, b, c,d; char string=CHINA; a=1; b=2; c=3; d=4; PR(D1, a); PR(D2, a, b); PR(D3, a, b, c); PR(D4, a, b, c, d); PR(S, string); 1121231234CHINA返回9.2 “文件包含”處理 “文件包含”處理是指一個源文件可以將另一個源文件包含(插入)進(jìn)來的處理。它等價于先將兩個源文件合并成一個源文件,然后再編譯。兩個編譯后的目標(biāo)文件是完全一樣的。 一般形式是:#include “文件名” #include #include ABBA相當(dāng)于File1.cFi
10、le2.cFile1.c包含注意:包含處理是在編譯時完成的,當(dāng)被包含的文件修改后,所有包含它的文件必須全部重新編譯。#define PR printf #define NL n #define D %dt #define D1 D NL #define D2 D D NL #define D3 D D D NL #define D4 D D D D NL #define S %s #include #include “format.h”void main() int a, b, c,d; char string=CHINA; a=1; b=2; c=3; d=4; PR(D1, a); PR(
11、D2, a, b); PR(D3, a, b, c); PR(D4, a, b, c, d); PR(S, string); format.h文件:file1.c文件:說明:1 一個include命令只能指定一個被包含的文件,如果要包含多個文件,要用多個include命令。2 如果file1包含file2,file2用到file3的內(nèi)容,則可在file1中分別include file2和file3,且file3在file2之前包含(因?yàn)閒ile2中用到file3)。即file1中應(yīng)是: #include “file3.c” #include “file2.c”3 在一個被包含文件中可以包含另一
12、個被包含文件,即文件包含是可以嵌套的。上一個問題可以是: 在 file1中有預(yù)處理命令 #include “file2.c” 在 file2中有預(yù)處理命令 #include “file3.c”返回 4. 在#include命令中,文件名可以用雙引號或尖括號,二者的區(qū)別是: 用雙引號:系統(tǒng)先在引用被包含文件的源程序文件(file1)所在目錄中尋找被包含文件,若找不到,再按系統(tǒng)指定的方式檢索其它目錄。 而用尖括號:不檢索file1所在目錄,直接檢索系統(tǒng)指定的目錄。 5. 被包含文件(file2)與包含文件(file1)在預(yù)編譯后成為一個文件,因此,如果file2中有全局靜態(tài)變量,它也在file1中
13、有效,不必用extern說明。9.3 條件編譯通常源程序的所有語句都被編譯,但有時希望根據(jù)不同條件編譯不同部分,這就是條件編譯。條件編譯命令有以下幾種形式:1#ifdef 標(biāo)識符 (判斷此前是否用#define定義過了“標(biāo)識符”) 程序段1 #else程序段2 #endif 功能:當(dāng)所指定的標(biāo)識符已經(jīng)被#define定義過,則在程序編譯階段只編譯程序段1,否則編譯程序段2。其中部分#else可以省略。 這種條件編譯對于提高C源程序的通用性是很有用的。如我們編寫一個可能應(yīng)用于不同機(jī)型的應(yīng)用程序,但不同機(jī)型的整型數(shù)位數(shù)不同,我們可以用如下的條件編譯:#ifdefIBM-PC (判斷此前是否用#define定義過“IBM-PC”)#defineINTEGER_SIZE16#else#defineINTEGER_SIZE32#endif定義過未定義過功能:當(dāng)所指定的標(biāo)識符未被#define定義過,則在程序編譯階段只編譯程序段1,否則編譯程序段2。2#ifndef標(biāo)識符程序段1 #else程序段2 #endif3#if表達(dá)式程序段1 #else程序段2 #endif功能:當(dāng)表達(dá)式的值為真,編譯程序段1,否則編譯程序段2。例題:輸入一行字母字符,根據(jù)需要設(shè)置條件編譯,使之能將字母全改為大寫輸出,或全改為小寫字母輸出。
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年大理州強(qiáng)制隔離戒毒所公開招聘輔警5人備考題庫及一套答案詳解
- 2025年監(jiān)獄戒毒系統(tǒng)招聘475人備考題庫及參考答案詳解1套
- 2025年肇慶市德慶縣教育局所屬公辦幼兒園公開招聘合同制工作人員備考題庫完整參考答案詳解
- 上海海事局2026年關(guān)于加強(qiáng)春節(jié)期間車輛安全管理的通知
- 建筑施工項(xiàng)目部黨支部工作職責(zé)
- 推動高質(zhì)量發(fā)展專題研討發(fā)言
- 2025年云南大學(xué)附屬中學(xué)星耀學(xué)校招聘備考題庫及一套完整答案詳解
- 2025年首都醫(yī)科大學(xué)附屬北京朝陽醫(yī)院石景山醫(yī)院派遣合同制職工招聘備考題庫完整參考答案詳解
- 2025年鳳岡縣人民政府行政執(zhí)法協(xié)調(diào)監(jiān)督局關(guān)于選聘行政執(zhí)法人民監(jiān)督員的備考題庫及1套參考答案詳解
- 2025年中國科學(xué)院力學(xué)研究所SKZ專項(xiàng)辦公室人員招聘備考題庫帶答案詳解
- 道路運(yùn)輸從業(yè)人員安全培訓(xùn)內(nèi)容
- DB33∕T 2099-2025 高速公路邊坡養(yǎng)護(hù)技術(shù)規(guī)范
- 2025版合規(guī)管理培訓(xùn)與文化深化試卷及答案
- 超星爾雅學(xué)習(xí)通《科學(xué)計(jì)算與MATLAB語言(中南大學(xué))》2025章節(jié)測試附答案
- 綠色簡約風(fēng)王陽明傳知行合一
- 重精管理培訓(xùn)
- 2023-2024學(xué)年廣東省深圳市南山區(qū)七年級(上)期末地理試卷
- 《無機(jī)及分析化學(xué)》實(shí)驗(yàn)教學(xué)大綱
- 2023巖溶塌陷調(diào)查規(guī)范1:50000
- JJG 548-2018測汞儀行業(yè)標(biāo)準(zhǔn)
- 二年級【語文(統(tǒng)編版)】語文園地一(第二課時)課件
評論
0/150
提交評論