版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第8章 預(yù)處理命令本章概述 本章的學(xué)習(xí)目標(biāo)主要內(nèi)容本章概述本章介紹宏定義的兩種形式,介紹文件包含的使用方法,介紹條件編譯的概念。第8章 預(yù)處理命令本章的學(xué)習(xí)目標(biāo): 本章教學(xué)目的: 掌握宏定義的兩種形式,掌握文件包含的使用方法了解條件編譯的概念。 本章教學(xué)重點(diǎn): 宏定義的兩種形式,文件包含的使用方法。 本章教學(xué)難點(diǎn): 帶參數(shù)的宏定義。第8章 預(yù)處理命令第8章 預(yù)處理命令8.1 宏定義 8.2 “文件包含”處理 8.3 條件編譯 8.4 本章小結(jié)主要內(nèi)容: 編譯預(yù)處理是指一些行首以#開頭的特殊語句,必須在對程序進(jìn)行通常的編譯之前,先對程序中這些特殊的命令進(jìn)行“預(yù)處理”,即根據(jù)預(yù)處理命令對程序作相應(yīng)
2、的處理(例如,若程序中用# define命令定義了一個符號常量A,則在預(yù)處理時將程序中所有的A都置換為指定的字符串)。經(jīng)過預(yù)處理后程序不再包括預(yù)處理命令了,最后再由編譯程序?qū)︻A(yù)處理后的源程序進(jìn)行通常的編譯處理,得到可供執(zhí)行的目標(biāo)代碼。C語言與其它高級語言的一個重要區(qū)別是可以使用預(yù)處理命令和具有預(yù)處理的功能。第8章 預(yù)處理命令C提供的預(yù)處理功能主要有以下三種: 宏定義、文件包含和條件編譯它們分別用宏定義命令、文件包含命令和條件編譯命令來實(shí)現(xiàn)。為了與一般C語句相區(qū)別,這些命令以符號“”開頭。 8.1 宏定義 宏定義指的是用#define定義的命令行,有不帶參數(shù)和帶參數(shù)兩種形式。 8.1.1 不帶參
3、數(shù)的宏定義不帶參數(shù)的宏定義的一般形式為: # define 標(biāo)識符 字符串含義是用指定的宏名(即標(biāo)識符)來代表其后字符串。 例如: #define SIZE 10000 #define PI 3.1415926 #define FORMAT “%d,%d,%dn”作用是指用標(biāo)識符SIZE來代替字符串“10000”,用標(biāo)識符PI來代替字符串“3.1415926”,用標(biāo)識符FORMAT來代替字符串“ “%d,%d,%dn” ”, 在編譯預(yù)處理時,將程序中在該命令以后出現(xiàn)的所有的SIZE用10000代替、PI用3.1415926代替、FORMAT用“%d,%d,%dn”代替。這種方法使用戶能以一個簡
4、單的名字代替一個長的字符串,可以減小重復(fù)編程工作量,而且不容易出錯。 把定義時所用的標(biāo)識符稱為“宏名”,即SIZE、PI和FORMAT都是宏名。在預(yù)編譯時將宏名替換成字符串的過程稱為“宏展開”。注意:宏名習(xí)慣用大寫字母表示。定義宏與定義變量含義不同,宏定義只是作字符替換,并不給宏名分配內(nèi)存空間。 例8.1 # include #define SIZE 5int main() int i,sum=0; int dataSIZE; for(i=0;iSIZE;i+) scanf(“%d”,&datai); sum=sum+datai; printf(“sum=%dn”,sum); return 0
5、; 運(yùn)行此程序可計算5個數(shù)組元素值的總和。對宏定義的說明: (1)定義宏的目的是提高程序的可讀性和通用性,便于程序的修改。例如若要把例8.1中數(shù)組data的元素個數(shù)改變?yōu)?0,則只要將“#define SIZE 5”改為“#define SIZE 10”即可,程序中的其它語句均不用修改。 (2)不要在宏定義的行末加分號,因?yàn)楹甓x不是C語句,加分號后,會將分號也作為字符串的組成部分,宏展開后可能出現(xiàn)錯誤。 (3)宏定義可以出現(xiàn)在程序的任何位置,一般位于文件開頭,寫在函數(shù)的外面。宏名的有效范圍是從定義處到本源文件結(jié)束??梢杂?undef命令終止宏定義的作用域。例如: #define PI 3.1
6、415926 int main() #undef PI 由于#undef的作用,使PI的作用范圍在#undef行處終止。若在#undef PI之后再出現(xiàn)PI,則是無效的。 (4)宏定義是用宏名代替一個字符串,凡在宏定義有效范圍內(nèi)的宏名都用該字符串代替,但要注意:雙引號內(nèi)的與宏名相同的字符串不認(rèn)為是宏名,不進(jìn)行替換。 例如: #define YES 1 printf(“YES”); 程序?qū)@示YES,而不是1。 (5)可以引用前面已經(jīng)定義的宏名來定義新的宏,例如: define I1 30 define I2 60 define J I1+I2 define K J*2+J/2+I2 這里J引用
7、了I1和I2,K引用了J和I2。 注意K展開是:30+60*2+30+60/2+60, 不要以為是:(30+60)*2+(30+60)/2+60。 除非前面的定義是:define J (I1+I2)。8.1.2 帶參數(shù)的宏定義 帶參數(shù)的宏定義的一般形式為: #define標(biāo)識符(形參表) 字符串 帶參數(shù)的宏展開時,還要進(jìn)行參數(shù)替換。宏定義中形參表中的形參,在程序中將用實(shí)參替換。例如: #define PI 3.14159 #define V(r) 4*PI*r*r*r/3 V(r)為帶參數(shù)的宏,例如在程序中使用V(6)時,是用6代替宏定義中的形式參數(shù)r,V(6)展開為:4*3.14159*6*
8、6*6/3,這是用來計算半徑為6的球的體積。 例8.2 # include #define S(a, b, h) (a+b)*h/2 int main() int c1=6,c2=8,c3=10; printf(“S=%dn”,S(c1, c2, c3); return 0; S(c1,c2,c3)展開為:(c1+c2)*c3/2。程序?qū)嶋H執(zhí)行的是下面的輸出語句: printf(“S=%dn”,(c1+c2)*c3/2); 如果將上面的S(c1,c2,c3)換成S(6, c2, 2+8),運(yùn)行程序后,輸出結(jié)果還是70嗎? 在使用帶參數(shù)的宏定義時,宏名和括號之間不能有空格,否則系統(tǒng)會把括號、形參
9、和字符串認(rèn)為是一個字符串。 例如,如果有 define S (x,y) x*y 會被認(rèn)為: S是符號常量(不帶參的宏名),它代表字符串“(x,y) x*y”。 上面介紹的用帶參數(shù)的宏求球的體積和梯形的面積等問題顯然也可以用函數(shù)解決。 帶參數(shù)的宏和函數(shù)在形式上有相似的地方,但是它們有許多不同點(diǎn): (1)宏展開是在編譯時進(jìn)行的,不占用程序運(yùn)行時間,在展開時并不分配內(nèi)存單元,即使是帶參數(shù)的宏也不分配內(nèi)存單元;而函數(shù)調(diào)用則是在程序運(yùn)行時進(jìn)行處理的,占用程序運(yùn)行時間,要為形參分配臨時的內(nèi)存單元。 (2) 宏展開只是替換;而函數(shù)調(diào)用時,要計算實(shí)參表達(dá)式的值后傳遞給形參,不是替換。函數(shù)調(diào)用時存在著從實(shí)參向形
10、參傳遞數(shù)據(jù)的過程,而使用帶參數(shù)的宏,也不存在傳遞數(shù)據(jù)的過程。 (3)宏名以及它的參數(shù)都不存在類型問題,展開時用指定的字符串替換即可。而函數(shù)中的實(shí)參和形參都要定義類型。 (4)宏展開后對源程序長度有影響,而函數(shù)調(diào)用對源程序長度無影響。 有些問題,用宏和函數(shù)都可以,如下例:用函數(shù):max(int x,int y) return(xy)?x:y; main( ) int a,b,c,d,t; t =max(a+b,c+d); 用宏 : # define MAX(x,y) (x)(y)?(x):(y)main( )int a,b,c,d,t; t = MAX(a+b,c+d); 賦值語句展開后為 t
11、= (a+b)(c+d)?(a+b):(c+d);8.2 “文件包含”處理 C語言提供了# include命令用來實(shí)現(xiàn)“文件包含”的操作。作用是將一個源文件的全部內(nèi)容包含進(jìn)另一個源文件中來。 被包含的文件可以是C語言源文件、庫函數(shù)頭文件等。因?yàn)? include命令行通常都放在文件的開頭,所以這些被包含的文件通常被稱為“標(biāo)題文件”或“頭文件”,常以“.h”(h為head的縮寫)為文件的擴(kuò)展名。當(dāng)然也可以用其他文件擴(kuò)展名,但無論用什么擴(kuò)展名,這個被包含文件必須是文本文件。 C集成環(huán)境為用戶提供了很多庫函數(shù),每一個庫函數(shù)都有自己對應(yīng)的頭文件,在C語言庫函數(shù)與用戶程序之間進(jìn)行信息通信時,要使用一些庫
12、函數(shù)中定義的數(shù)據(jù)和變量,在使用某一庫函數(shù)時,都要在程序中使用# include命令將該函數(shù)所對應(yīng)的頭文件包含進(jìn)來,否則,程序在編譯時報錯。 文件包含的使用格式為: include “文件名” 或 include 文件名 其中的“文件名”和的區(qū)別是:當(dāng)使用“文件名” 形式時,預(yù)處理程序首先檢索當(dāng)前文件目錄是否有該文件,如果沒有,再檢索C編譯系統(tǒng)中指定的目錄;而使用形式時,預(yù)處理程序直接檢索C編譯系統(tǒng)指定的目錄。使用“”時,格式文件包含名可加路徑。 例如:#include “d:tcincludestdio.h” 常用的標(biāo)準(zhǔn)庫頭文件的擴(kuò)展名都是h,如:# include /*標(biāo)準(zhǔn)輸入輸出函數(shù)文件*
13、/# include /*字符串函數(shù)文件*/# include /*字符函數(shù)文件*/# include /*數(shù)學(xué)函數(shù)庫文件*/ “文件包含”命令可以節(jié)省程序設(shè)計人員的勞動。例如,可以將經(jīng)常使用一組固定的符號常量(g=9.81 , pi=3.1415926 , e=2.718等等)用宏定義命令組成一個文件,只要用#include命令這個文件包含到自己所寫的源文件中即可。 正確的使用#include語句,將會減少不必要的重復(fù)工作,提高編程效率。特別是在一個軟件開發(fā)小組共同協(xié)作開發(fā)大型軟件時,include文件十分有用,利用它可以定義程序中共同的常量、函數(shù)原型、宏等,這樣可以便于修改且不易出錯。例8
14、.5 編制如下內(nèi)容的被包含文件,將其拷貝到C語言目錄中。該文件名為bj.h。 #define START #define OK #define MAX(x,y) xy ? x : y編寫另一程序file.c,內(nèi)容如下: # include # include “bj.h” int main() START double x=500.0, y=100.0; long lx=25, ly=37; printf(“double MAX=%lfn”, MAX(x,y); printf(“l(fā)ong MAX=%ldn”, MAX(lx,ly); return 0; OK 注意:在編譯時并不是作為兩個文件進(jìn)
15、行連接的,而是作為一個源程序編譯,得到一個目標(biāo)(.obj)文件。執(zhí)行程序file.c,結(jié)果顯示如下:double MAX=500.000000long MAX=37說明: (1)如果要包含n個文件,必須用n個include命令。即一個include命令只能指定一個被包含文件。 (2)假設(shè)“wj1.c”、“wj2.c”、“wj3.c”是三個不同的文件,若在“wj1.c”有如下兩行命令: # include # include 則在文件“wj1.c”中可以用“wj2.c”和“wj3.c”的內(nèi)容,在文件“wj2.c” 中可以用“wj3.c”的內(nèi)容,不必在文件“wj2.c” 中再使用“#include
16、 ”命令。 若在“wj1.c” 中只有“#include ” 命令,而“wj1.c”中又要使用“wj3.c”的內(nèi)容,也可以讓“wj2.c”中出現(xiàn)“#include ” 命令。即文件包含可以嵌套使用。 例8.4/*file.c*/#include #include “myfile.txt”int main() fun(); return 0;myfile.txt文本文件內(nèi)容如下void fun()char c; if(c=getchar()!=n) putchar(c); fun(); 在編譯file.c時,預(yù)處理過程中用myfile.txt文件的文本替換file.c中的#include “my
17、file.txt”, 因此本例程序功能是接受用戶的按鍵,直到按回車鍵為止,然后將字符序列顯示出來。8.3 條件編譯 有時希望當(dāng)滿足某條件時對一組語句進(jìn)行編譯,而當(dāng)條件不滿足時則編譯另一組語句,使得同一個源程序在不同的編譯條件下能夠產(chǎn)生不同的目標(biāo)代碼文件。這就是“條件編譯”。 條件編譯命令有以下3種形式:1、 # ifdef 標(biāo)識符 程序段1 # else 程序段2 # endif 作用:當(dāng)標(biāo)識符已經(jīng)被定義過(一般是用define命令定義),則對程序段1進(jìn)行編譯;否則編譯程序段2。 其中(# else 程序段2 )可以沒有。 作用: 若標(biāo)識符未被定義,則編譯程序段1;否則編譯程序段2。2、# ifndef 標(biāo)識符 程序段1 # else 程序段2 # endif3、 # if 表達(dá)式 程序段1 # else 程序段2 # endif 作用:當(dāng)指定的表達(dá)式值為真(非零)時編譯程序段1;否則編譯程序段2。# include # define TERM 0 int main() int i, a10; float s=0, t=1 ; for (i=0; i10; i+) scanf(“%d”, &ai); # if TERM for (i=0; i10; i+) t=t*ai; printf (%f, t ); # else for
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 浙江省衢州市(2024年-2025年小學(xué)六年級語文)部編版期中考試((上下)學(xué)期)試卷及答案
- 2025年上半年遼寧錦州義縣事業(yè)單位面向社會公開招聘工作人員15人重點(diǎn)基礎(chǔ)提升(共500題)附帶答案詳解-1
- 2025年上半年遼寧省阜新市大數(shù)據(jù)管理中心招聘專業(yè)技術(shù)人員7人易考易錯模擬試題(共500題)試卷后附參考答案
- 2025年上半年遼寧省朝陽凌源市為三家子蒙古族鄉(xiāng)政府招聘8人(勞務(wù)派遣)易考易錯模擬試題(共500題)試卷后附參考答案
- 2025年上半年贛州經(jīng)濟(jì)技術(shù)開發(fā)區(qū)招商局(商務(wù)局)招考易考易錯模擬試題(共500題)試卷后附參考答案
- 2025年上半年贛州市上猶縣招考兼職講解員易考易錯模擬試題(共500題)試卷后附參考答案
- 2025年上半年貴州黔西南州晴隆縣引進(jìn)人才擬聘(第六號)易考易錯模擬試題(共500題)試卷后附參考答案
- 2025年上半年貴州遵義余慶縣招聘事業(yè)單位人員擬聘人員(十)重點(diǎn)基礎(chǔ)提升(共500題)附帶答案詳解-1
- 2025年上半年貴州省貴陽市白云區(qū)沙文政府招聘27人易考易錯模擬試題(共500題)試卷后附參考答案
- 2025年上半年貴州省畢節(jié)市赫章縣招聘事業(yè)單位22人(第二批)重點(diǎn)基礎(chǔ)提升(共500題)附帶答案詳解-1
- 軟件項(xiàng)目應(yīng)急措施及方案
- 2025河北邯鄲經(jīng)開國控資產(chǎn)運(yùn)營管理限公司招聘專業(yè)技術(shù)人才5名高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2024年民法典知識競賽考試題庫及答案(共50題)
- 2025老年公寓合同管理制度
- 2024-2025學(xué)年人教版數(shù)學(xué)六年級上冊 期末綜合卷(含答案)
- 鈑金設(shè)備操作培訓(xùn)
- 感染性腹瀉的護(hù)理查房
- 中考英語688高頻詞大綱詞頻表
- 九年級初三中考物理綜合復(fù)習(xí)測試卷3套(含答案)
- 管理制度評價表(填寫模板)
- 工地設(shè)計代表服務(wù)記錄
評論
0/150
提交評論