C語(yǔ)言教學(xué)課件:第9章 預(yù)處理_第1頁(yè)
C語(yǔ)言教學(xué)課件:第9章 預(yù)處理_第2頁(yè)
C語(yǔ)言教學(xué)課件:第9章 預(yù)處理_第3頁(yè)
C語(yǔ)言教學(xué)課件:第9章 預(yù)處理_第4頁(yè)
C語(yǔ)言教學(xué)課件:第9章 預(yù)處理_第5頁(yè)
已閱讀5頁(yè),還剩19頁(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)介

1、第九章 基本概念A(yù)NSI C標(biāo)準(zhǔn)規(guī)定可以在源程序中加入一些“預(yù)處理命令” ,以改進(jìn)程序設(shè)計(jì)環(huán)境,提高編程效率。這些預(yù)處理命令是由ANSI C統(tǒng)一規(guī)定的,但是它不是C語(yǔ)言本身的組成部分,不能直接對(duì)它們進(jìn)行編譯(因?yàn)榫幾g程序不能識(shí)別它們)。必須在對(duì)程序進(jìn)行通常的編譯之前,先對(duì)程序中這些特殊的命令進(jìn)行“預(yù)處理”。經(jīng)過(guò)預(yù)處理后程序可由編譯程序?qū)︻A(yù)處理后的源程序進(jìn)行通常的編譯處理,得到可供執(zhí)行的目標(biāo)代碼。 基本概念C語(yǔ)言與其他高級(jí)語(yǔ)言的一個(gè)重要區(qū)別是可以使用預(yù)處理命令和具有預(yù)處理的功能。提供的預(yù)處理功能主要有以下三種:宏定義文件包含條件編譯 這些功能分別用宏定義命令、文件包含命令、條件編譯命令來(lái)實(shí)現(xiàn)。為

2、了與一般語(yǔ)句相區(qū)別,這些命令以符號(hào)“”開頭。例如: #define #include 9.1 宏定義9.1.1 不帶參數(shù)的宏定義 宏定義一般形式為:define 標(biāo)識(shí)符 字符串例如:define PI 3.1415926宏定義的作用是在本程序文件中用指定的標(biāo)識(shí)符PI來(lái)代替“3.1415926”這個(gè)字符串,這種方法使用戶能以一個(gè)簡(jiǎn)單的名字代替一個(gè)長(zhǎng)的字符串。這個(gè)標(biāo)識(shí)符(名字)稱為“宏名”。在預(yù)編譯時(shí)將宏名替換成字符串的過(guò)程稱為“宏展開”。define是宏定義命令。#include #define PI 3.1415926 void main() float l,s,r,v; printf(inp

3、ut radius:); scanf(%f,&r); l=2.0*PI*r; s=PI*r*r; v=4.0/3*PI*r*r*r;printf(l=%10.4fns=%10.4fnv=%10.4fn,l,s,v);例9.1 使用不帶參數(shù)的宏定義。 input radius: 4 運(yùn)行情況如下:1=25.1328s=50.2655v=150.7966(1) 宏名一般習(xí)慣用大寫字母表示,以便與變量名相區(qū)別。但這并非規(guī)定,也可用小寫字母。(2) 使用宏名代替一個(gè)字符串,可以減少程序中重復(fù)書寫某些字符串的工作量。(3) 宏定義是用宏名代替一個(gè)字符串,只作簡(jiǎn)單置換,不作正確性檢查。只有在編譯已被宏展開

4、后的源程序時(shí)才會(huì)發(fā)現(xiàn)語(yǔ)法錯(cuò)誤并報(bào)錯(cuò)。說(shuō)明:(4) 宏定義不是語(yǔ)句,不必在行末加分號(hào)。如果加了分號(hào)則會(huì)連分號(hào)一起進(jìn)行置換。(5) define命令出現(xiàn)在程序中函數(shù)的外面,宏名的有效范圍為定義命令之后到本源文件結(jié)束。通常,define命令寫在文件開頭,函數(shù)之前,作為文件一部分,在此文件范圍內(nèi)有效。(6) 可以用undef命令終止宏定義的作用域。例如: 說(shuō)明:#define G 9.8 _ void main() G的有效范圍 - #undef G f1() 在f1函數(shù)中,不再代表9.8。這樣可以靈活控制宏定義的作用范圍。(7) 在進(jìn)行宏定義時(shí),可以引用已定義的宏名,可以層層置換。 說(shuō)明:#incl

5、ude #define R 3.0#define PI 3.1415926#define L 2*PI*R#define S PI*R*Rvoid main() printf(L=%fnS=%fn,L,S);運(yùn)行情況如下:L=18.849556S=28.274333例9.2 在宏定義中引用已定義的宏名。 經(jīng)過(guò)宏展開后,printf函數(shù)中的輸出項(xiàng)被展開為: 2*3.1415926*3.0展開為 3.1415926*3.0*3.0printf函數(shù)調(diào)用語(yǔ)句展開為:printf(“L=%FNS=%fn”,2*3.1415926*3.0,3.1415926*3.0*3.0);(8) 對(duì)程序中用雙撇號(hào)括起

6、來(lái)的字符串內(nèi)的字符,即使與宏名相同,也不進(jìn)行置換。 (9) 宏定義是專門用于預(yù)處理命令的一個(gè)專用名詞,它與定義變量的含義不同,只作字符替換,不分配內(nèi)存空間。說(shuō)明: 9.1.2 帶參數(shù)的宏定義 作用:不是進(jìn)行簡(jiǎn)單的字符串替換,還要進(jìn)行參數(shù)替換。 帶參數(shù)的宏定義一般形式為:define 宏名(參數(shù)表) 字符串 字符串中包含在括弧中所指定的參數(shù)#define S(a,b) a*b area=S(3,2);例:對(duì)帶實(shí)參的宏(如S(3,2),則按define命令行中指定的字符串從左到右進(jìn)行置換。若串中包含宏中的形參(如a、b),則將程序中相應(yīng)的實(shí)參(可以是常量、變量或表達(dá)式)代替形參。這樣就形成了置換的

7、字符串。對(duì)帶參的宏定義是這樣展開置換的: 因此賦值語(yǔ)句展開為:area=3*2#include #define PI 3.1415926#define S(r) PI*r*rvoid main() float a,area; a=3.6; area=S(a); printf(r=%fnarea=%fn,a,area);運(yùn)行情況如下:=3.600000 area=40.715038例9.3 使用帶參的宏 賦值語(yǔ)句“area=S(a); ” 經(jīng)宏展開后為:area=3.1415926*; (1)對(duì)帶參數(shù)的宏展開只是將語(yǔ)句中的宏名后面括號(hào)內(nèi)的實(shí)參字符串代替define 命令行中的形參。(2) 在宏定

8、義時(shí),在宏名與帶參數(shù)的括弧之間不應(yīng)加空格,否則將空格以后的字符都作為替代字符串的一部分。 說(shuō)明:(1) 函數(shù)調(diào)用時(shí),先求出實(shí)參表達(dá)式的值,然后代入形參。而使用帶參的宏只是進(jìn)行簡(jiǎn)單的字符替換。(2) 函數(shù)調(diào)用是在程序運(yùn)行時(shí)處理的,為形參分配臨時(shí)的內(nèi)存單元。而宏展開則是在編譯前進(jìn)行的,在展開時(shí)并不分配內(nèi)存單元,不進(jìn)行值的傳遞處理,也沒(méi)有“返回值”的概念。(3) 對(duì)函數(shù)中的實(shí)參和形參類型要求一致。而宏名無(wú)類型,它的參數(shù)也無(wú)類型,只是一個(gè)符號(hào)代表,展開時(shí)代入指定的字符串即可。宏定義時(shí),字符串可以是任何類型的數(shù)據(jù)。(4) 調(diào)用函數(shù)只可得到一個(gè)返回值,而用宏可以設(shè)法得到幾個(gè)結(jié)果。例9.4 帶參數(shù)的宏和函數(shù)

9、的區(qū)別:(5) 使用宏次數(shù)多時(shí),宏展開后源程序長(zhǎng),因?yàn)槊空归_一次都使程序增長(zhǎng),而函數(shù)調(diào)用不會(huì)使源程序變長(zhǎng)。(6) 宏替換不占運(yùn)行時(shí)間,只占編譯時(shí)間。而函數(shù)調(diào)用則占運(yùn)行時(shí)間(分配單元、保留現(xiàn)場(chǎng)、值傳遞、返回)。帶參數(shù)的宏和函數(shù)的區(qū)別: 如果善于利用宏定義,可以實(shí)現(xiàn)程序的簡(jiǎn)化,如事先將程序中的“輸出格式”定義好,以減少在輸出語(yǔ)句中每次都要寫出具體的輸出格式的麻煩。所謂“文件包含”處理是指一個(gè)源文件可以將另外一個(gè)源文件的全部?jī)?nèi)容包含進(jìn)來(lái)。語(yǔ)言提供了#include命令用來(lái)實(shí)現(xiàn)“文件包含”的操作。其一般形式為: #include 文件名或 #include 9.2 “文件包含”處理注意: 在編譯時(shí)并不

10、是分別對(duì)兩個(gè)文件分別進(jìn)行編譯,然后再將它們的目標(biāo)程序連接的,而是在經(jīng)過(guò)編譯預(yù)處理后將對(duì)應(yīng)文件包含到主文件中,得到一個(gè)新的源程序,然后對(duì)這個(gè)文件進(jìn)行編譯,得到一個(gè)目標(biāo)(.obj)文件。被包含的文件成為新的源文件的一部分,而非單獨(dú)生成目標(biāo)文件。(1) 一個(gè)#include命令只能指定一個(gè)被包含文件,如果要包含個(gè)文件,要用個(gè)#include命令。(2) 如果文件包含文件,而在文件中要用到文件的內(nèi)容,則可在文件中用兩個(gè)include命令分別包含文件和文件,而且文件應(yīng)出現(xiàn)在文件之前,即在file1.c中定義。(3) 在一個(gè)被包含文件中又可以包含另一個(gè)被包含文件,即文件包含是可以嵌套的。 說(shuō)明:(4) 在

11、#include命令中,文件名可以用雙撇號(hào)或尖括號(hào)括起來(lái)。(5) 被包含文件(file2.h)與其所在的文件(即用#include命令的源文件file2.c),在預(yù)編譯后已成為同一個(gè)文件(而不是兩個(gè)文件)。因此,如果file2.h中有全局靜態(tài)變量,它也在file1.c文件中有效,不必用extern聲明。 說(shuō)明: 9. 條件編譯概念:所謂“條件編譯”,是對(duì)部分內(nèi)容指定編譯的條件,使其只在滿足一定條件才進(jìn)行編譯。條件編譯命令的幾種形式:(1)ifdef 標(biāo)識(shí)符 程序段else 程序段endif(2)ifndef 標(biāo)識(shí)符 程序段else 程序段endif(3) if 表達(dá)式 程序段else 程序段endif這里的“程序段”,可以是語(yǔ)句組也可以是命令行。例97 輸入一行字母字符,根據(jù)需要設(shè)置條件編譯,使之能將字母全改為大寫輸出,或全改為小寫

溫馨提示

  • 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)論