《計(jì)算機(jī)基礎(chǔ)與C語(yǔ)言程序設(shè)計(jì)》課件第8章_第1頁(yè)
《計(jì)算機(jī)基礎(chǔ)與C語(yǔ)言程序設(shè)計(jì)》課件第8章_第2頁(yè)
《計(jì)算機(jī)基礎(chǔ)與C語(yǔ)言程序設(shè)計(jì)》課件第8章_第3頁(yè)
《計(jì)算機(jī)基礎(chǔ)與C語(yǔ)言程序設(shè)計(jì)》課件第8章_第4頁(yè)
《計(jì)算機(jī)基礎(chǔ)與C語(yǔ)言程序設(shè)計(jì)》課件第8章_第5頁(yè)
已閱讀5頁(yè),還剩24頁(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ù)處理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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論