![第8章編譯預(yù)處理_第1頁](http://file4.renrendoc.com/view/9914dc7809fcc5b14d820ef2bfae272b/9914dc7809fcc5b14d820ef2bfae272b1.gif)
![第8章編譯預(yù)處理_第2頁](http://file4.renrendoc.com/view/9914dc7809fcc5b14d820ef2bfae272b/9914dc7809fcc5b14d820ef2bfae272b2.gif)
![第8章編譯預(yù)處理_第3頁](http://file4.renrendoc.com/view/9914dc7809fcc5b14d820ef2bfae272b/9914dc7809fcc5b14d820ef2bfae272b3.gif)
![第8章編譯預(yù)處理_第4頁](http://file4.renrendoc.com/view/9914dc7809fcc5b14d820ef2bfae272b/9914dc7809fcc5b14d820ef2bfae272b4.gif)
![第8章編譯預(yù)處理_第5頁](http://file4.renrendoc.com/view/9914dc7809fcc5b14d820ef2bfae272b/9914dc7809fcc5b14d820ef2bfae272b5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第8章編譯預(yù)處理本章教學(xué)目標(biāo):理解include命令的含義,熟練掌握include命令的用法;掌握#宏定義#define命令的使用;了解條件編譯的各種形式和意義。第8章編譯預(yù)處理8.1文件包含#include命令8.2宏定義#define命令8.3條件編譯
8.1文件包含#include命令文件包含由#include命令來說明。編譯預(yù)處理時(shí),系統(tǒng)將包含文件的內(nèi)容插入到程序中引用它的地方,即程序中相應(yīng)的#include命令所在處,如下圖8-1所示:圖8-1#include命令
文件包含的一般形式為:#include<文件名>和#include“文件名”例如,#include“math.h”特別注意(1)每行寫一句,只能寫一個(gè)文件名,結(jié)尾不加分號(hào)“;”。被包含的文件必須是源文件而不能是目標(biāo)文件。文件名可以任意,但通常以“h”(head的第一個(gè)字母)為后綴,因?yàn)楸话募ǔT诎募念^部,被包含文件也因此而被稱為“頭文件”。(2)文件包含可以嵌套,即在一個(gè)被包含的文件中可以包含另一個(gè)被包含文件,但要注意避免重復(fù)包含和重復(fù)定義問題,采用的方法是條件編譯。(3)當(dāng)一個(gè)文件中有多條include命令將自己編寫的文件包含進(jìn)來時(shí),應(yīng)注意它們的先后次序。比如,如果文件A包含文件B和文件C,而文件B要用到文件C中的內(nèi)容,那么,在文件A中應(yīng)將#include“C”寫在#include“B”的前面。(4)在include命令中,文件名可以用尖括號(hào)或雙引號(hào)括起來,二者都是合法的,其區(qū)別是用尖括弧時(shí),系統(tǒng)到存放C庫函數(shù)頭文件所在的目錄中去尋找要包含的文件。用雙引號(hào)時(shí),系統(tǒng)先在用戶當(dāng)前目錄中尋找要包含的文件,若找不到,再按標(biāo)準(zhǔn)方式查找。8.2宏定義#define命令
使用#define命令指定一個(gè)標(biāo)識(shí)符(即名字)來代表一個(gè)字符串。宏定義分為不帶參數(shù)和帶參數(shù)兩種。8.2.1不帶參數(shù)的宏定義不帶參數(shù)的宏定義是指用一個(gè)指定的標(biāo)識(shí)符(宏名)來代表一個(gè)常量(宏體)。其一般格式為:#define<標(biāo)識(shí)符><字符串>其含義是將程序中該命令以后出現(xiàn)<標(biāo)識(shí)符>的地方均用<字符串>來替代。其中標(biāo)識(shí)符習(xí)慣上用大寫字母表示?!纠?.1】不帶參數(shù)的宏定義的應(yīng)用。#definePI3.1415926main(){floatr,circle,area;
printf(“\nPleaseinputradius:“);
scanf(“%f”,&r);circle=2*PI*r;area=PI*r*r;
printf(“\ncircle=%farea=%f”,circle,area);}
說明在程序中使用宏定義可以提高程序的易讀性和通用性,便于程序的修改、調(diào)試和移植。使用中應(yīng)注意下面幾點(diǎn):(1)習(xí)慣上宏名一般用大寫字母表示;(2)宏定義不是C語句,書寫時(shí)行末不應(yīng)加分號(hào);(3)在進(jìn)行宏定義時(shí),可以引用已定義的宏名;(4)當(dāng)宏體是表達(dá)式時(shí),為穩(wěn)妥起見常將它用括弧括起來;(5)若宏名字出現(xiàn)在字符串內(nèi),則預(yù)處理時(shí)它將不被宏替換;(6)若宏名字出現(xiàn)在標(biāo)識(shí)符內(nèi),則預(yù)處理時(shí)它也不被替換;(7)同一個(gè)宏名可以重復(fù)定義,如果不一致,編譯時(shí)會(huì)發(fā)出警告,并以最后一次定義為準(zhǔn)。(8)當(dāng)宏定義在一行中寫不下時(shí),可在行尾用反斜杠“\”進(jìn)行續(xù)行。(9)宏定義通常放在源程序文件的開頭,其作用域是整個(gè)源程序。也可以在函數(shù)內(nèi)部作宏定義,這時(shí)宏名字的作用域只在本函數(shù)。可用#undef終止宏定義的作用域:(10)與變量定義不同,宏定義只作字符替換,不分配內(nèi)存空間,也不做正確性檢查。(11)宏定義時(shí)可以不包含宏體,即寫成:#define宏名此時(shí)僅說明宏名已被定義。8.2.2帶參數(shù)的宏定義帶參數(shù)的宏更具靈活性。定義的一般形式為:#define宏名(參數(shù)表)宏體例#defineRECT(A,B)A*B宏替換時(shí),當(dāng)實(shí)參取不同值時(shí),宏將取得不同的值,這是使用帶參數(shù)宏定義的優(yōu)點(diǎn)。對(duì)于帶參數(shù)的宏定義,使用中應(yīng)注意以下問題:(1)定義帶參數(shù)的宏時(shí),宏體中一般應(yīng)含有參數(shù)。另外,宏名與圓括弧之間不應(yīng)留有空格;(2)為了保證宏展開的正確性,通常宏體中的參數(shù)以及宏體本身都用圓括弧擴(kuò)起來;(3)ANSIC提供了兩個(gè)預(yù)處理操作符:#和##。這兩個(gè)操作符用于宏體中。#操作符使跟在它后面的實(shí)參轉(zhuǎn)換為帶引號(hào)的字符串。##操作符用于連接兩個(gè)符號(hào)。(4)帶參的宏與函數(shù)很相似,當(dāng)兩者是有著本質(zhì)上的區(qū)別的?!纠?.2】使用宏得到多個(gè)結(jié)果。#definePI3.1415926#defineSPHERE(R,C,S,V)C=2*PI*R;S=4*PI*R*R;V=4.0/3*PI*R*R*Rvoidmain(){floatr,c,s,v;printf("InputtheSphere'sradius:");scanf("%f",&r); SPHERE(r,c,s,v);
printf("r=%f,c=%f,s=%f,v=%f\n",r,c,s,v);}宏調(diào)用語句SPHERE(r,c,s,v);經(jīng)預(yù)編譯宏展開后變成為三條語句:c=2*3.1415926*r;s=4*3.1415926*r*r;v=4.0/3*3.1415926*r*r*r;程序的運(yùn)行情況為:InputtheSphere'sradius:10r=10.000000,c=62.831852,s=1256.637085,v=4188.790133【例8.3】
從鍵盤輸入兩個(gè)整數(shù),并把其中較大的值顯示出來。要求用宏定義編程。#include“stdio.h”#defineMAX(a,b)((a)>(b)?(a):(b))main(){intx,y,z;printf(“InputTownumbers\n”);scanf(“%d%d”,&x,&y);z=MAX(x,y);printf(“Max=%d”,z);} 8.2.3終止宏定義
宏命令#undef用于終止宏定義的作用域。一般形式為: #undef宏名例如: #defineMULT(x,y)((x)*(y)) main() { ┅ } #undefMULT(x,y) function() { ┅ }由于在函數(shù)function()之后,使用#undef終止宏名MULT(x,y)的作用,在函數(shù)function()中MULT(x,y)不再起作用。#undef也可用于函數(shù)內(nèi)部。
8.3條件編譯
為了便于程序調(diào)試和移植等,C語言提供了“條件編譯”預(yù)處理命令,這些命令可以控制編譯程序?qū)υ创a進(jìn)行有條件的,編譯。條件編譯有以下幾種命令形式:形式一:#if表達(dá)式程序段1#else
程序段2#endif形式二:#if表達(dá)式1程序段1#elif表達(dá)式2程序段2#elif表達(dá)式3程序段3
#else
程序段n#endif
形式三:#ifdef宏名程序段1#else
程序段2#endif形式四:#ifndef
宏名程序段1#else
程序段2#endif形式五:
#ifdefined(宏名)程序段1#else
程序段2#endif
例如,在alloc.h文件中,可以看到以下關(guān)于NULL的定義,其目的是適合不同編譯模式的兼容性。
#ifndefNULL#ifdefined(__TINY__)||defined(__SMALL__)||defined(__MEDIUM__)#defineNULL 0#else#defineNULL 0L#endif#endif【例8.4】
輸入一個(gè)口令,根據(jù)需要設(shè)置條件編譯,使之在調(diào)試程序時(shí),按原碼輸出;在使用時(shí)輸出“*”號(hào)。#defineDEBUGvoidmain(void){charpass[80];int=-1;printf(
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年別墅建設(shè)合同范例
- 2025年農(nóng)村道路安全改善工程合同
- 2025年企業(yè)食堂經(jīng)營承包合同
- 2025年二手車交易雙方性權(quán)益保障協(xié)議書
- 2025年醫(yī)療康復(fù)人才交流策劃協(xié)議
- 2025年交通供電檢測(cè)裝備項(xiàng)目申請(qǐng)報(bào)告
- 2025年二手房產(chǎn)交易合同額外補(bǔ)充協(xié)議
- 2025年海洋臺(tái)站儀器項(xiàng)目提案報(bào)告
- 2025年度學(xué)生權(quán)益保障協(xié)議書
- 2025年太陽能熱電站交易合同模板
- 2025年中國銅畫市場(chǎng)調(diào)查研究報(bào)告
- 山西省太原市2024-2025學(xué)年九年級(jí)上學(xué)期期末歷史試題(含答案)
- 2024年全國體育專業(yè)單獨(dú)招生考試數(shù)學(xué)試卷試題真題(含答案)
- 2025屆高三八省聯(lián)考語文試卷分析 課件
- 2025年江蘇連云港灌云縣招聘“鄉(xiāng)村振興專干”16人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 教務(wù)主任在教務(wù)管理經(jīng)驗(yàn)大會(huì)上發(fā)言稿
- 2025年度檢修計(jì)劃
- 2024-2025學(xué)年冀教版數(shù)學(xué)五年級(jí)上冊(cè)期末測(cè)試卷(含答案)
- 商業(yè)綜合體市場(chǎng)調(diào)研報(bào)告
- 京東考試答案
- 《對(duì)折剪紙》)ppt
評(píng)論
0/150
提交評(píng)論