第8章編譯預(yù)處理_第1頁(yè)
第8章編譯預(yù)處理_第2頁(yè)
第8章編譯預(yù)處理_第3頁(yè)
第8章編譯預(yù)處理_第4頁(yè)
第8章編譯預(yù)處理_第5頁(yè)
已閱讀5頁(yè),還剩16頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(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命令來(lái)說(shuō)明。編譯預(yù)處理時(shí),系統(tǒng)將包含文件的內(nèi)容插入到程序中引用它的地方,即程序中相應(yīng)的#include命令所在處,如下圖8-1所示:圖8-1#include命令

文件包含的一般形式為:#include<文件名>和#include“文件名”例如,#include“math.h”特別注意(1)每行寫(xiě)一句,只能寫(xiě)一個(gè)文件名,結(jié)尾不加分號(hào)“;”。被包含的文件必須是源文件而不能是目標(biāo)文件。文件名可以任意,但通常以“h”(head的第一個(gè)字母)為后綴,因?yàn)楸话募ǔT诎募念^部,被包含文件也因此而被稱為“頭文件”。(2)文件包含可以嵌套,即在一個(gè)被包含的文件中可以包含另一個(gè)被包含文件,但要注意避免重復(fù)包含和重復(fù)定義問(wèn)題,采用的方法是條件編譯。(3)當(dāng)一個(gè)文件中有多條include命令將自己編寫(xiě)的文件包含進(jìn)來(lái)時(shí),應(yīng)注意它們的先后次序。比如,如果文件A包含文件B和文件C,而文件B要用到文件C中的內(nèi)容,那么,在文件A中應(yīng)將#include“C”寫(xiě)在#include“B”的前面。(4)在include命令中,文件名可以用尖括號(hào)或雙引號(hào)括起來(lái),二者都是合法的,其區(qū)別是用尖括弧時(shí),系統(tǒng)到存放C庫(kù)函數(shù)頭文件所在的目錄中去尋找要包含的文件。用雙引號(hào)時(shí),系統(tǒng)先在用戶當(dāng)前目錄中尋找要包含的文件,若找不到,再按標(biāo)準(zhǔn)方式查找。8.2宏定義#define命令

使用#define命令指定一個(gè)標(biāo)識(shí)符(即名字)來(lái)代表一個(gè)字符串。宏定義分為不帶參數(shù)和帶參數(shù)兩種。8.2.1不帶參數(shù)的宏定義不帶參數(shù)的宏定義是指用一個(gè)指定的標(biāo)識(shí)符(宏名)來(lái)代表一個(gè)常量(宏體)。其一般格式為:#define<標(biāo)識(shí)符><字符串>其含義是將程序中該命令以后出現(xiàn)<標(biāo)識(shí)符>的地方均用<字符串>來(lái)替代。其中標(biāo)識(shí)符習(xí)慣上用大寫(xiě)字母表示?!纠?.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);}

說(shuō)明在程序中使用宏定義可以提高程序的易讀性和通用性,便于程序的修改、調(diào)試和移植。使用中應(yīng)注意下面幾點(diǎn):(1)習(xí)慣上宏名一般用大寫(xiě)字母表示;(2)宏定義不是C語(yǔ)句,書(shū)寫(xiě)時(shí)行末不應(yīng)加分號(hào);(3)在進(jìn)行宏定義時(shí),可以引用已定義的宏名;(4)當(dāng)宏體是表達(dá)式時(shí),為穩(wěn)妥起見(jiàn)常將它用括弧括起來(lái);(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)宏定義在一行中寫(xiě)不下時(shí),可在行尾用反斜杠“\”進(jìn)行續(xù)行。(9)宏定義通常放在源程序文件的開(kāi)頭,其作用域是整個(gè)源程序。也可以在函數(shù)內(nèi)部作宏定義,這時(shí)宏名字的作用域只在本函數(shù)??捎?undef終止宏定義的作用域:(10)與變量定義不同,宏定義只作字符替換,不分配內(nèi)存空間,也不做正確性檢查。(11)宏定義時(shí)可以不包含宏體,即寫(xiě)成:#define宏名此時(shí)僅說(shuō)明宏名已被定義。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)注意以下問(wèn)題:(1)定義帶參數(shù)的宏時(shí),宏體中一般應(yīng)含有參數(shù)。另外,宏名與圓括弧之間不應(yīng)留有空格;(2)為了保證宏展開(kāi)的正確性,通常宏體中的參數(shù)以及宏體本身都用圓括弧擴(kuò)起來(lái);(3)ANSIC提供了兩個(gè)預(yù)處理操作符:#和##。這兩個(gè)操作符用于宏體中。#操作符使跟在它后面的實(shí)參轉(zhuǎn)換為帶引號(hào)的字符串。##操作符用于連接兩個(gè)符號(hào)。(4)帶參的宏與函數(shù)很相似,當(dāng)兩者是有著本質(zhì)上的區(qū)別的。【例8.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)用語(yǔ)句SPHERE(r,c,s,v);經(jīng)預(yù)編譯宏展開(kāi)后變成為三條語(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】

從鍵盤(pán)輸入兩個(gè)整數(shù),并把其中較大的值顯示出來(lái)。要求用宏定義編程。#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ǔ)言提供了“條件編譯”預(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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論