版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第8章編譯預(yù)處理8.1文件包含8.2宏定義8.3條件編譯編譯預(yù)處理是C語(yǔ)言編譯程序?qū)語(yǔ)言源程序進(jìn)行編譯前,對(duì)預(yù)處理命令進(jìn)行預(yù)先處理的過(guò)程。編譯預(yù)處理由編譯預(yù)處理程序完成。
C語(yǔ)言中的編譯預(yù)處理命令有:#define、#include、#undef、#error等。以#include、#define等開(kāi)頭的程序行稱為編譯預(yù)處理命令行,必須以“#”開(kāi)始,行尾不得加“;”,以區(qū)別于C語(yǔ)句。這些命令行的語(yǔ)法與C語(yǔ)言中其它部分語(yǔ)法無(wú)關(guān)。它們可以根據(jù)需要出現(xiàn)在程序的任何一行的開(kāi)始部位,其作用一直持續(xù)到原文件的末尾,除非重新設(shè)置。
C語(yǔ)言中常用的編譯預(yù)處理命令有:文件包含命令、宏定義命令和條件編譯命令。
在C語(yǔ)言中,擴(kuò)展名為“.h”的文件被稱為頭文件。它們包含了大量的符號(hào)常量定義、函數(shù)說(shuō)明等。編寫(xiě)程序時(shí)若需要使用這些文件,就要用文件包含命令將這些文件包含到源程序中。
文件包含命令是以“#include”開(kāi)始的預(yù)處理命令,其主要功能就是將指定的文件內(nèi)容嵌入到文件包含命令所在的地方,取代該命令,從而把指定文件和當(dāng)前的源程序文件組合在一起。8.1文件包含
#include的一般語(yǔ)法格式為
#inclucde<文件名>
或
#include"文件名"
兩種形式的區(qū)別是:使用尖括號(hào)時(shí),編譯預(yù)處理程序只在系統(tǒng)指定的文件夾中尋找文件;而使用雙引號(hào)時(shí),編譯預(yù)處理程序首先在當(dāng)前文件所在的文件夾中尋找文件,如果找不到則在系統(tǒng)指定的文件夾中再尋找文件。
圖8-1文件包含命令的的作用一個(gè)大的程序由很多模塊組成,一般由多個(gè)程序員共同編寫(xiě)??梢园压眯畔⒔M成一個(gè)文件,其它文件使用時(shí),就可以用文件包含命令將其嵌入,這樣可以節(jié)省編程時(shí)間,提高編程效率。
說(shuō)明:
(1)一般情況下文件包含命令放在源程序的開(kāi)頭。
(2)一條文件包含命令只能包含一個(gè)文件,如果需要包含多個(gè)文件就需要多條文件包含命令。
(3)文件包含命令可以嵌套,即被包含文件中還可以包含其它文件。
(4)文件包含命令中的文件名必須包括主文件名及其擴(kuò)展名。
(5)當(dāng)被包含文件修改后,對(duì)包含該文件的源文件必須重新進(jìn)行編譯、連接。
C語(yǔ)言源程序中允許用一個(gè)標(biāo)識(shí)符來(lái)表示一個(gè)字符串,稱為“宏定義”,其中,標(biāo)識(shí)符稱為“宏名”。在編譯預(yù)處理時(shí),對(duì)程序中所有出現(xiàn)的“宏名”,都用宏定義中的字符串去替換,稱為“宏替換”或“宏展開(kāi)”。8.2宏定義8.2.1不帶參數(shù)的宏定義
不帶參數(shù)的宏定義的一般語(yǔ)法格式為
#define宏名替換文本
它的作用是:在其后的源程序中,凡是遇到宏名的地方,編譯預(yù)處理程序都將其替換為宏定義中的替換文本。
例如:
#definePI3.1415926
#defineforeverfor(;;)
以上的宏定義在宏替換時(shí),凡是源程序中出現(xiàn)的PI(字符串中的除外),編譯預(yù)處理程序都將其替換為3.1415926;凡是源程序中出現(xiàn)的forever(字符串中的除外),編譯預(yù)處理程序都將其替換為for(;;)。說(shuō)明:
(1)宏名一般用大寫(xiě)標(biāo)識(shí)符表示,但這不是規(guī)定,只是人們的習(xí)慣。
(2)宏定義只是一個(gè)宏名與替換文本之間的簡(jiǎn)單替換。它與定義變量不同,不為宏名分配內(nèi)存空間,只做替換,且替換時(shí)并不做正確性檢查。
(3)宏定義不是C語(yǔ)句,所以行尾不需要“;”。如果行尾有“;”,連同分號(hào)都將替換到宏名中去。
(4)一個(gè)很長(zhǎng)的宏定義可以在每一個(gè)要被連續(xù)的行后面加上反斜杠“\”連續(xù)下去。
(5)宏替換只作用于標(biāo)識(shí)符,而不作用于字符串,即雙引號(hào)內(nèi)與宏名相同的字符串不
替換。
(6)宏定義中可以使用已經(jīng)定義的宏名,即后面的宏定義可以使用前面宏定義的宏名。
(7)宏定義必須寫(xiě)在函數(shù)之外,其作用域?yàn)楹甓x命令起到源程序結(jié)束。如要中途終止其作用域,可使用#undef命令(也必須寫(xiě)在函數(shù)之外)。
【例8.1】編寫(xiě)程序,輸入半徑,計(jì)算并輸出圓的周長(zhǎng)和面積。
#definePI3.1415926
#include<stdio.h>
main()
{
floatr,l,s;
printf("Inputr:");
scanf("%f",&r);
l=2*PI*r;
s=PI*r*r;
printf("r=%f,l=%f,s=%f\n",r,l,s);
}
程序運(yùn)行結(jié)果:
Inputr:3↙
r=3.000000,l=18.849556,s=28.274334
【例8.2】編寫(xiě)程序,對(duì)格式輸出函數(shù)、整型輸出格式、實(shí)數(shù)輸出格式進(jìn)行宏定義并在程序中應(yīng)用。
#definePRprintf
#defineD"%d"
#defineF"%f"
#include<stdio.h>
main()
{
inti=1,j=2;
floata=3.45,b=6.789;
PR(D","D"\n",i,j);
PR(F","F"\n",a,b);
}
程序運(yùn)行結(jié)果:
1,2
3.450000,6.7890008.2.2帶參數(shù)的宏定義
帶參數(shù)的宏定義的一般語(yǔ)法格式為
#define宏名(形參表)替換文本
它的作用是:在其后的源程序中,凡是遇到帶實(shí)參的宏名,編譯預(yù)處理程序都將其替換為宏定義中的替換文本,在替換時(shí),特別要將替換文本中的形參替換為程序中的實(shí)參。
例如:
#definesum(a,b)a+b
其中sum是宏名,a、b是形參。當(dāng)程序中出現(xiàn)sum(x,y)這樣的宏名時(shí),編譯預(yù)處理程序?qū)哑涮鎿Q為x+y。說(shuō)明:
(1)帶參數(shù)的宏定義仍然是一個(gè)宏名與替換文本之間的簡(jiǎn)單替換,只是在替換時(shí)要將替換文本中的形參替換為程序中的實(shí)參,且替換時(shí)還是不作正確性檢查。
(2)對(duì)于帶參數(shù)的宏定義,宏名與參數(shù)表之間不能有空格,否則就變成不帶參數(shù)的宏
定義。
(3)帶參數(shù)的宏定義中的形參是標(biāo)識(shí)符,而在宏替換時(shí)的實(shí)參可以是任意的表達(dá)式。
(4)對(duì)于帶參數(shù)的宏定義,在定義時(shí)最好將形參和整個(gè)替換文本用括號(hào)分別括起來(lái),這樣在宏替換后可以避免與原宏定義意義不符的錯(cuò)誤。
【例8.3】編寫(xiě)程序,用帶參數(shù)的宏定義實(shí)現(xiàn)輸出三個(gè)整數(shù)中的最大值。
#defineMAX(x,y)((x)>(y)?(x):(y))
#include"stdio.h"
main()
{
inta,b,c,max;
printf("Inputa,b,c:");
scanf("%d%d%d",&a,&b,&c);
max=MAX(a,b);
max=MAX(max,c);
printf("MAX=%d\n",max);
}
程序運(yùn)行結(jié)果:
Inputa,b,c:123↙
MAX=3
一般情況下,C語(yǔ)言源程序中的所有代碼都要進(jìn)行編譯。條件編譯是指源程序中的某些代碼只有在滿足特定條件時(shí)才進(jìn)行編譯,否則不進(jìn)行編譯。條件編譯由條件編譯命令完成。條件編譯命令分為兩類:一類是#if,另一類是#ifdef和#ifndef。8.3條件編譯8.3.1#if
1.形式1
#if常量表達(dá)式
程序段1
#else
程序段2
#endif
它的作用是:當(dāng)常量表達(dá)式的值為非0時(shí),則對(duì)程序段1進(jìn)行編譯,否則;對(duì)程序段2進(jìn)行編譯。
2.形式2
#if常量表達(dá)式
程序段
#endif
它的作用是:當(dāng)常量表達(dá)式的值為非0時(shí),則對(duì)程序段進(jìn)行編譯;否則,不對(duì)程序段進(jìn)行編譯。
3.形式3
#if常量表達(dá)式1
程序段1
#elif常量表達(dá)式2
程序段2
#elif常量表達(dá)式n
程序段n
[#else…程序段n+1]
#endif
它的作用是:按常量表達(dá)式順序進(jìn)行計(jì)算,第一個(gè)為非0的常量表達(dá)式i將引起對(duì)程序段i的編譯,并且不再計(jì)算后面的表達(dá)式。如果所有常量表達(dá)式的值都為0,則對(duì)程序段n+1進(jìn)行編譯。8.3.2#ifdef和#ifndef
1.?#ifdef
形式1
#ifdef宏名
程序段1
#else
程序段2
#endif
它的作用是:如果宏名在此之前已經(jīng)由#define給出定義,則對(duì)程序段1進(jìn)行編譯,否則,對(duì)程序段2進(jìn)行編譯。形式2
#ifdef宏名
程序段
#endif
它的作用是:如果宏名在此之前已經(jīng)由#define給出定義,則對(duì)程序段進(jìn)行編譯,否則,對(duì)程序段不進(jìn)行編譯。
2.#ifndef
形式1
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年數(shù)據(jù)服務(wù)與云存儲(chǔ)技術(shù)許可合同
- 福建省控規(guī)入庫(kù)合同范例
- 餐廳管理托管合同范例
- 商洛學(xué)院《機(jī)電傳動(dòng)控制》2023-2024學(xué)年第一學(xué)期期末試卷
- 個(gè)人買(mǎi)貓合同范例
- 汕頭大學(xué)《中學(xué)思想政治課課程標(biāo)準(zhǔn)與教材研究》2023-2024學(xué)年第一學(xué)期期末試卷
- 陜西中醫(yī)藥大學(xué)《新聞傳播大講堂》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024至2030年車(chē)床標(biāo)牌項(xiàng)目投資價(jià)值分析報(bào)告
- 種苗訂購(gòu)合同范例
- 放射防護(hù)合同范例
- 輕食行業(yè)宏觀環(huán)境分析報(bào)告
- 中外鋼琴名作賞析智慧樹(shù)知到期末考試答案2024年
- 小學(xué)心理健康教育主題班會(huì)活動(dòng)記錄表
- 河北省滄州市2022-2023學(xué)年高一年級(jí)上冊(cè)期末考試英語(yǔ)試題(解析版)
- 太常引建康中秋夜為呂叔潛賦課件
- 韓國(guó)豪華游輪7日游課件
- 高中數(shù)學(xué)成績(jī)分析報(bào)告
- 自來(lái)水廠安全教育課件
- 關(guān)愛(ài)自己從心開(kāi)始課件
- 2024歷史建筑測(cè)繪建檔規(guī)程
- 工地水電倉(cāng)庫(kù)管理制度
評(píng)論
0/150
提交評(píng)論