




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第8章編譯預(yù)處理8.1文件包含8.2宏定義8.3條件編譯編譯預(yù)處理是C語言編譯程序?qū)語言源程序進(jìn)行編譯前,對預(yù)處理命令進(jìn)行預(yù)先處理的過程。編譯預(yù)處理由編譯預(yù)處理程序完成。
C語言中的編譯預(yù)處理命令有:#define、#include、#undef、#error等。以#include、#define等開頭的程序行稱為編譯預(yù)處理命令行,必須以“#”開始,行尾不得加“;”,以區(qū)別于C語句。這些命令行的語法與C語言中其它部分語法無關(guān)。它們可以根據(jù)需要出現(xiàn)在程序的任何一行的開始部位,其作用一直持續(xù)到原文件的末尾,除非重新設(shè)置。
C語言中常用的編譯預(yù)處理命令有:文件包含命令、宏定義命令和條件編譯命令。
在C語言中,擴展名為“.h”的文件被稱為頭文件。它們包含了大量的符號常量定義、函數(shù)說明等。編寫程序時若需要使用這些文件,就要用文件包含命令將這些文件包含到源程序中。
文件包含命令是以“#include”開始的預(yù)處理命令,其主要功能就是將指定的文件內(nèi)容嵌入到文件包含命令所在的地方,取代該命令,從而把指定文件和當(dāng)前的源程序文件組合在一起。8.1文件包含
#include的一般語法格式為
#inclucde<文件名>
或
#include"文件名"
兩種形式的區(qū)別是:使用尖括號時,編譯預(yù)處理程序只在系統(tǒng)指定的文件夾中尋找文件;而使用雙引號時,編譯預(yù)處理程序首先在當(dāng)前文件所在的文件夾中尋找文件,如果找不到則在系統(tǒng)指定的文件夾中再尋找文件。
圖8-1文件包含命令的的作用一個大的程序由很多模塊組成,一般由多個程序員共同編寫??梢园压眯畔⒔M成一個文件,其它文件使用時,就可以用文件包含命令將其嵌入,這樣可以節(jié)省編程時間,提高編程效率。
說明:
(1)一般情況下文件包含命令放在源程序的開頭。
(2)一條文件包含命令只能包含一個文件,如果需要包含多個文件就需要多條文件包含命令。
(3)文件包含命令可以嵌套,即被包含文件中還可以包含其它文件。
(4)文件包含命令中的文件名必須包括主文件名及其擴展名。
(5)當(dāng)被包含文件修改后,對包含該文件的源文件必須重新進(jìn)行編譯、連接。
C語言源程序中允許用一個標(biāo)識符來表示一個字符串,稱為“宏定義”,其中,標(biāo)識符稱為“宏名”。在編譯預(yù)處理時,對程序中所有出現(xiàn)的“宏名”,都用宏定義中的字符串去替換,稱為“宏替換”或“宏展開”。8.2宏定義8.2.1不帶參數(shù)的宏定義
不帶參數(shù)的宏定義的一般語法格式為
#define宏名替換文本
它的作用是:在其后的源程序中,凡是遇到宏名的地方,編譯預(yù)處理程序都將其替換為宏定義中的替換文本。
例如:
#definePI3.1415926
#defineforeverfor(;;)
以上的宏定義在宏替換時,凡是源程序中出現(xiàn)的PI(字符串中的除外),編譯預(yù)處理程序都將其替換為3.1415926;凡是源程序中出現(xiàn)的forever(字符串中的除外),編譯預(yù)處理程序都將其替換為for(;;)。說明:
(1)宏名一般用大寫標(biāo)識符表示,但這不是規(guī)定,只是人們的習(xí)慣。
(2)宏定義只是一個宏名與替換文本之間的簡單替換。它與定義變量不同,不為宏名分配內(nèi)存空間,只做替換,且替換時并不做正確性檢查。
(3)宏定義不是C語句,所以行尾不需要“;”。如果行尾有“;”,連同分號都將替換到宏名中去。
(4)一個很長的宏定義可以在每一個要被連續(xù)的行后面加上反斜杠“\”連續(xù)下去。
(5)宏替換只作用于標(biāo)識符,而不作用于字符串,即雙引號內(nèi)與宏名相同的字符串不
替換。
(6)宏定義中可以使用已經(jīng)定義的宏名,即后面的宏定義可以使用前面宏定義的宏名。
(7)宏定義必須寫在函數(shù)之外,其作用域為宏定義命令起到源程序結(jié)束。如要中途終止其作用域,可使用#undef命令(也必須寫在函數(shù)之外)。
【例8.1】編寫程序,輸入半徑,計算并輸出圓的周長和面積。
#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);
}
程序運行結(jié)果:
Inputr:3↙
r=3.000000,l=18.849556,s=28.274334
【例8.2】編寫程序,對格式輸出函數(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);
}
程序運行結(jié)果:
1,2
3.450000,6.7890008.2.2帶參數(shù)的宏定義
帶參數(shù)的宏定義的一般語法格式為
#define宏名(形參表)替換文本
它的作用是:在其后的源程序中,凡是遇到帶實參的宏名,編譯預(yù)處理程序都將其替換為宏定義中的替換文本,在替換時,特別要將替換文本中的形參替換為程序中的實參。
例如:
#definesum(a,b)a+b
其中sum是宏名,a、b是形參。當(dāng)程序中出現(xiàn)sum(x,y)這樣的宏名時,編譯預(yù)處理程序?qū)哑涮鎿Q為x+y。說明:
(1)帶參數(shù)的宏定義仍然是一個宏名與替換文本之間的簡單替換,只是在替換時要將替換文本中的形參替換為程序中的實參,且替換時還是不作正確性檢查。
(2)對于帶參數(shù)的宏定義,宏名與參數(shù)表之間不能有空格,否則就變成不帶參數(shù)的宏
定義。
(3)帶參數(shù)的宏定義中的形參是標(biāo)識符,而在宏替換時的實參可以是任意的表達(dá)式。
(4)對于帶參數(shù)的宏定義,在定義時最好將形參和整個替換文本用括號分別括起來,這樣在宏替換后可以避免與原宏定義意義不符的錯誤。
【例8.3】編寫程序,用帶參數(shù)的宏定義實現(xiàn)輸出三個整數(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);
}
程序運行結(jié)果:
Inputa,b,c:123↙
MAX=3
一般情況下,C語言源程序中的所有代碼都要進(jìn)行編譯。條件編譯是指源程序中的某些代碼只有在滿足特定條件時才進(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時,則對程序段1進(jìn)行編譯,否則;對程序段2進(jìn)行編譯。
2.形式2
#if常量表達(dá)式
程序段
#endif
它的作用是:當(dāng)常量表達(dá)式的值為非0時,則對程序段進(jìn)行編譯;否則,不對程序段進(jìn)行編譯。
3.形式3
#if常量表達(dá)式1
程序段1
#elif常量表達(dá)式2
程序段2
#elif常量表達(dá)式n
程序段n
[#else…程序段n+1]
#endif
它的作用是:按常量表達(dá)式順序進(jìn)行計算,第一個為非0的常量表達(dá)式i將引起對程序段i的編譯,并且不再計算后面的表達(dá)式。如果所有常量表達(dá)式的值都為0,則對程序段n+1進(jìn)行編譯。8.3.2#ifdef和#ifndef
1.?#ifdef
形式1
#ifdef宏名
程序段1
#else
程序段2
#endif
它的作用是:如果宏名在此之前已經(jīng)由#define給出定義,則對程序段1進(jìn)行編譯,否則,對程序段2進(jìn)行編譯。形式2
#ifdef宏名
程序段
#endif
它的作用是:如果宏名在此之前已經(jīng)由#define給出定義,則對程序段進(jìn)行編譯,否則,對程序段不進(jìn)行編譯。
2.#ifndef
形式1
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 新手指南健康管理師考試試題及答案
- 2025-2030中國熱加工糕點行業(yè)供需分析及發(fā)展前景研究報告
- 2025-2030中國煙氣收塵設(shè)備行業(yè)供需趨勢及投資風(fēng)險研究報告
- 深入探討信息系統(tǒng)項目的質(zhì)量管理試題及答案
- 2025-2030中國滴灌行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略研究報告
- 2024年西醫(yī)臨床考核準(zhǔn)備試題及答案
- 2025-2030中國溫室設(shè)備行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略研究報告
- 2025-2030中國混凝土外振搗器行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略研究報告
- 2025-2030中國液體洗滌劑行業(yè)市場深度調(diào)研及發(fā)展趨勢與投資研究報告
- 教師資格考試課程設(shè)計試題及答案
- 2025年重慶聯(lián)合產(chǎn)權(quán)交易所集團股份有限公司招聘筆試參考題庫附帶答案詳解
- 汽車維修工(初級)技能理論考試核心題庫(職??荚?00題)
- 2024年版《輸變電工程標(biāo)準(zhǔn)工藝應(yīng)用圖冊》
- 《軍事理論與軍事技能》全套教學(xué)課件
- 一年級下冊《讀讀童謠和兒歌》試題及答案共10套
- 關(guān)羽單刀赴會
- 【完整版】鎖骨骨折護理查房課件
- 部編版四年級下冊語文課件-第三單元-單元解讀-共64張PPT)
- 崗位說明書公安處民警
- 節(jié)電質(zhì)量管理QC發(fā)布降低辦公大樓用電量教育PPT動態(tài)課件
- 高一物理圓周運動計算題
評論
0/150
提交評論