版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、1 第七章 編譯預(yù)處理2預(yù)處理與編譯過程圖編譯程序不能識別預(yù)處理命令!源程序源程序(含預(yù)處(含預(yù)處理命令)理命令)預(yù)處理器預(yù)處理器源程序源程序(不含預(yù)處(不含預(yù)處理命令)理命令)編譯器編譯器目標(biāo)目標(biāo)代碼代碼按預(yù)處理命令對程序按預(yù)處理命令對程序進(jìn)行文本替換等處理進(jìn)行文本替換等處理3提綱o 概述o 宏定義n 不帶參數(shù)的宏n 帶參數(shù)的宏n 取消宏定義o 文件包含o 練習(xí)4預(yù)處理命令o 以“#”開頭,作為預(yù)處理命令的標(biāo)志o 以回車符結(jié)束(不是“;”)o 不同于語句,在程序正常編譯之前被處理o 三種常用的預(yù)處理命令n 宏定義命令n 文件包含命令n 條件編譯命令57.1 宏定義o 文本替換o #defin
2、eo 帶參數(shù)的宏o 不帶參數(shù)的宏67.1.1 不帶參數(shù)的宏o 作用:用一個(gè)指定的標(biāo)識符來代表一個(gè)字符序列,即定義符號常量。o 宏定義形式:#define 標(biāo)識符 字符序列n 標(biāo)識符稱為“宏名”,一般習(xí)慣用大寫字母表示7宏替換o 在預(yù)處理過程中將宏定義之后的所有宏名逐一替換成相應(yīng)的替換文本,這一過程稱為“宏展開”或 “宏替換”。o 例:#define PI 3.14159s = PI * r * r;經(jīng)宏替換為:s = 3.14159 * r * r;8宏替換常見錯(cuò)誤o 例:#define PI 3.14159;s = PI * r * r;o 經(jīng)宏替換為:s = 3.14159; * r *
3、r;o 說明:宏定義不是C語句,不必在行末加分號,宏定義以“回車”結(jié)束。9宏替換常見錯(cuò)誤o 例:#define PI = 3.14159s = PI * r * r;o 經(jīng)宏替換為:s = =3.14159 * r * r;o 宏定義是用宏名代替一個(gè)字符序列,所以是作簡單的置換,不作正確性檢查。10宏替換o 例:#define LONG_STRING this isnot a very long stringo 一般單獨(dú)占一行。如寫成多行,要加續(xù)行符“”。11宏替換o 例:#define HI helloprintf(“HI”);o 字符串和注釋中與宏名相同的字符串不進(jìn)行宏展開。12宏替換o
4、例:#define X 5#define Y X + 1#define Z Y * Xa = Z; o 經(jīng)宏替換為:a = 5 + 1 * 5;o 在進(jìn)行宏定義時(shí),可以引用已定義的宏名,即允許嵌套使用宏。13不帶參數(shù)的宏o 宏定義并不為宏名分配內(nèi)存空間。o 可以沒有替換文本14使用無參宏定義的好處1、提高程序的可讀性2、不僅可以減少程序中重復(fù)書寫某些字串的工作量,而且修改起來也更方便157.1.2 帶參數(shù)的宏o 定義形式:#define 宏名(參數(shù)表) 字符序列o 調(diào)用形式:宏名(實(shí)參表) o 對帶參數(shù)的宏進(jìn)行宏展開的過程n 程序中宏定義之后出現(xiàn)的宏名將按#define命令行中指定的字符序列從
5、左到右進(jìn)行置換。n 字符序列中的宏形參,將以程序中對應(yīng)的宏實(shí)參替代。16示例o #define PM(x, y) x*yint a=1, b=2, c;c=PM(a+b, a-b);o 宏擴(kuò)展的結(jié)果:c=a+b*a-bc的值為117帶參數(shù)的宏(2)o 帶參數(shù)的宏使用過程中容易出現(xiàn)兩種錯(cuò)誤n 沒有對宏字符序列中參數(shù)加括號,而出現(xiàn)表達(dá)式運(yùn)算次序不符合意愿的結(jié)果n 在宏名和帶參數(shù)的括弧之間多加了空格。例如:#define S (r) PI*r*r18示例o #define MAX(x, y) (x)(y)?(x):(y)o int max(int x, int y) return x y ? x:y
6、;19宏和函數(shù)的區(qū)別o 函數(shù)調(diào)用先求出實(shí)參表達(dá)式值再帶入形參;而帶參數(shù)的宏則只進(jìn)行單純的文本替換。o 函數(shù)調(diào)用在程序運(yùn)行時(shí)處理,分配臨時(shí)內(nèi)存單元;而帶參數(shù)的宏則不會。o 函數(shù)中實(shí)參和形參之間類型要賦值相容;而宏不要求。o 使用宏的次數(shù)多時(shí),宏展開后源程序長,但是運(yùn)行時(shí)間短;使用函數(shù)的次數(shù)多時(shí),效果恰好相反。20P191 例7.1.1# include # define MAX(x,y) (x)(y)?(x):(y)int max(int x, int y) return xy?x:y ;void main()int a=10, b=20; float x=3.14, y=31.5;printf
7、(%dn,MAX(a,b); printf(%fn,MAX(x,y); printf(%dn,max(a,b);printf(%dn,max(x,y);printf(%fn,max(x,y); 運(yùn)行結(jié)果如下:2031.500020310.000021P192 例7.1.2# include # define CUBE(x) (x)*(x)*(x)int cube(int x) return x*x*x ;void main()int a=2, b;b=CUBE(a+);printf(%dn,b);b=CUBE(a);printf(%dn,b);a=2;b=cube(a+);printf(%dn
8、,b);b=cube(a);printf(%dn,b); 被擴(kuò)展為(a+)*(a+)*(a+) 8125函數(shù)調(diào)用 827227.1.3 取消宏定義o #define命令一般放在源文件的首部,宏名的有效范圍是定義命令之后直到該源文件結(jié)束。o 可以使用#undef命令終止宏定義的作用域。o 形式:#undef 宏名o 使用#undef的主要目的是把宏名局部化。237.2 條件編譯(*考試不作要求)#ifdef 宏名 語句塊1#else語句塊2#endif#ifdef 宏名 語句塊1#endif24#ifndef 宏名 語句塊1#else語句塊2#endif#ifndef 宏名 語句塊1#endif
9、25#if 常量表達(dá)式語句塊1#else語句塊2#endif#if 常量表達(dá)式語句塊1#endif267.3 文件包含o 所謂文件包含指:一個(gè)源文件將另一個(gè)源文件的全部內(nèi)容包含進(jìn)來。o 兩種形式n #include n #include 文件名o 這兩種形式的差別:使用不同的搜索路徑n 第一種形式采用的搜索路徑是C庫函數(shù)頭文件所在的目錄n 第二種形式采用的搜索路徑是:當(dāng)前目錄+ C庫函數(shù)頭文件所在的目錄277.3 文件包含o 通常用于包含頭文件(.h)o 文件包含可以嵌套,即被包含文件中還可以包含其他文件。287.4 多文件組織o 當(dāng)程序很大時(shí),就將一個(gè)程序分成幾個(gè)模塊,再通過在主程序中inc
10、lude其他模塊組合到一起編譯。29必做習(xí)題o 一(110)o 二 (14)上機(jī)完成30第3題#define MAX(a,b,c) (a)(b)?(a):(b)(c)?(a)(b)?(a):(b):(c)#include int main()float a,b,c;printf(請輸入欲進(jìn)行比較的3個(gè)數(shù):n);scanf(%f%f%f,&a,&b,&c);printf(最大的數(shù)為%fn,MAX(a,b,c);return 0;31第3題#define MAX(a,b,c) (a)(b)?(a):(b)(c)?(a)(b)?(a):(b):(c)a,b中大者a,b中大者a,b中大者再和c比32第4題#define YEAR(a) (a)%4=0
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年設(shè)備監(jiān)理師考試題庫及答案(歷年真題)
- 別墅澆筑工程施工合同(2篇)
- Unit1Science and Scientists(詞匯短語句式)-2025屆高三人教版英語一輪復(fù)習(xí)闖關(guān)攻略(解析版)
- 2025屆江蘇省淮安市涇口鎮(zhèn)初級中學(xué)中考生物最后沖刺模擬試卷含解析
- 2024年度天津市公共營養(yǎng)師之三級營養(yǎng)師通關(guān)題庫(附帶答案)
- 2024年度天津市公共營養(yǎng)師之二級營養(yǎng)師每日一練試卷A卷含答案
- 2024年度四川省公共營養(yǎng)師之四級營養(yǎng)師綜合檢測試卷B卷含答案
- 2024年度四川省公共營養(yǎng)師之三級營養(yǎng)師能力檢測試卷A卷附答案
- 2025關(guān)于貨車掛靠合同范本
- 2024鐵路旅客運(yùn)輸市場前景及投資研究報(bào)告
- 急救、生命支持類醫(yī)學(xué)裝備調(diào)配制度與流程
- 河南省駐馬店市重點(diǎn)中學(xué)2023-2024學(xué)年九年級上學(xué)期12月月考語文試題(無答案)
- 江蘇省無錫市2022-2023學(xué)年上學(xué)期初中學(xué)業(yè)水平調(diào)研測試九年級英語期末試題
- 超聲內(nèi)鏡穿刺護(hù)理課件
- 國家開放大學(xué)電大考試《心理學(xué)》課程形成性考核冊試題及答案(1-4)最全
- 四川省成都市泡桐樹小學(xué)小學(xué)數(shù)學(xué)五年級下冊期末試卷(培優(yōu)篇)
- 教練技術(shù)工具之:平衡輪課件
- 全國各省市縣統(tǒng)計(jì)表-
- 國家開放大學(xué)電大本科《管理案例分析》2023年期末試題及答案(試卷號:1304)
- 醋酸加尼瑞克注射液
- 中學(xué)查寢記錄
評論
0/150
提交評論