第9章編譯預(yù)處理_第1頁
第9章編譯預(yù)處理_第2頁
第9章編譯預(yù)處理_第3頁
第9章編譯預(yù)處理_第4頁
第9章編譯預(yù)處理_第5頁
已閱讀5頁,還剩18頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第第9章章 編譯預(yù)處理編譯預(yù)處理所謂編譯預(yù)處理是指,在對(duì)源程序進(jìn)行編譯所謂編譯預(yù)處理是指,在對(duì)源程序進(jìn)行編譯之前,先對(duì)源程序中的編譯預(yù)處理命令進(jìn)行之前,先對(duì)源程序中的編譯預(yù)處理命令進(jìn)行處理;然后再將處理的結(jié)果,和源程序一起處理;然后再將處理的結(jié)果,和源程序一起進(jìn)行編譯,以得到目標(biāo)代碼。進(jìn)行編譯,以得到目標(biāo)代碼。 本章目錄本章目錄9.1 宏定義宏定義9.2 文件包含文件包含9.3 條件編譯條件編譯 9.1 宏定義宏定義在語言中,在語言中,“宏宏”分為無參數(shù)的宏分為無參數(shù)的宏(簡(jiǎn)稱無參宏)和有參數(shù)的宏(簡(jiǎn)稱有參(簡(jiǎn)稱無參宏)和有參數(shù)的宏(簡(jiǎn)稱有參宏)兩種。宏)兩種。1. 1. 不帶參數(shù)的宏定義不帶

2、參數(shù)的宏定義2. 2. 帶參數(shù)的宏定義帶參數(shù)的宏定義Return不帶參數(shù)的宏定義不帶參數(shù)的宏定義1無參宏定義的一般格式無參宏定義的一般格式 #define 標(biāo)識(shí)符標(biāo)識(shí)符 語言符號(hào)字符串語言符號(hào)字符串其中:其中:“define”為宏定義命令;為宏定義命令;“標(biāo)識(shí)符標(biāo)識(shí)符”為所為所定義的宏名,通常用大寫字母表示,以便于與變量區(qū)別;定義的宏名,通常用大寫字母表示,以便于與變量區(qū)別;“語言符號(hào)字符串語言符號(hào)字符串”可以是常數(shù)、表達(dá)式、格式串等??梢允浅?shù)、表達(dá)式、格式串等。2宏展開:在預(yù)編譯時(shí)將宏名替換成字符串的過程。宏展開:在預(yù)編譯時(shí)將宏名替換成字符串的過程。例例9.1 輸入圓的半徑,求圓的周長(zhǎng)、面

3、積和球的體積。輸入圓的半徑,求圓的周長(zhǎng)、面積和球的體積。#define PI 3.1415926 main() float radius,length,area,volume;printf(Input a radius: ); scanf(%f,&radius);length=2*PI*radius; area=PI*radius*radius; volume=PI*radius*radius*radius*3/4; printf(len=%.2f,are=%.2f,vol=%.2fn, length, area, volume);不帶參數(shù)的宏定義不帶參數(shù)的宏定義3使用宏定義的優(yōu)點(diǎn)使用

4、宏定義的優(yōu)點(diǎn)(1)可提高源程序的可維護(hù)性)可提高源程序的可維護(hù)性(2)可提高源程序的可移植性)可提高源程序的可移植性 (3)減少源程序中重復(fù)書寫字符串的工作量)減少源程序中重復(fù)書寫字符串的工作量4使用說明使用說明(1)宏名一般用大寫字母表示,以示與變量區(qū)別)宏名一般用大寫字母表示,以示與變量區(qū)別,但這并非是規(guī)定。但這并非是規(guī)定。 (2)宏定義不是語句,所以)宏定義不是語句,所以不能在行尾加分號(hào)不能在行尾加分號(hào)。否。否則,宏展開時(shí),會(huì)將分號(hào)作為字符串的則,宏展開時(shí),會(huì)將分號(hào)作為字符串的1個(gè)字符,用于替?zhèn)€字符,用于替換宏名。換宏名。(3)在宏展開時(shí),預(yù)處理程序僅以按宏定義簡(jiǎn)單替換)在宏展開時(shí),預(yù)處

5、理程序僅以按宏定義簡(jiǎn)單替換宏名,而不作任何檢查。如果有錯(cuò)誤,只能由編譯程序在宏名,而不作任何檢查。如果有錯(cuò)誤,只能由編譯程序在編譯宏展開后的源程序時(shí)發(fā)現(xiàn)。編譯宏展開后的源程序時(shí)發(fā)現(xiàn)。(4)宏定義命令)宏定義命令#define出現(xiàn)在函數(shù)的外部,宏名的有出現(xiàn)在函數(shù)的外部,宏名的有效范圍是:從定義命令之后,效范圍是:從定義命令之后, 到本文件結(jié)束。通常,宏定到本文件結(jié)束。通常,宏定義命令放在文件開頭處義命令放在文件開頭處。 (5)可用)可用#undef終止宏定義的作用域。終止宏定義的作用域。(6)在進(jìn)行宏定義時(shí),可以引用已定義的宏名,層層置在進(jìn)行宏定義時(shí),可以引用已定義的宏名,層層置換換 。#def

6、ine PI 3.1415926#define Area(r) PI*(r)*(r)(7)對(duì)雙引號(hào)括起來的字符串內(nèi)的字符,即使與宏名同對(duì)雙引號(hào)括起來的字符串內(nèi)的字符,即使與宏名同名,也不進(jìn)行宏展開。名,也不進(jìn)行宏展開。 (8)宏與變量不同,只做字符替換,不分配內(nèi)存空間。)宏與變量不同,只做字符替換,不分配內(nèi)存空間。符號(hào)常量符號(hào)常量在定義無參宏時(shí),如果在定義無參宏時(shí),如果“語言符號(hào)字符串語言符號(hào)字符串”是一個(gè)常量,是一個(gè)常量,則相應(yīng)的則相應(yīng)的“宏名宏名”就是一個(gè)符號(hào)常量。就是一個(gè)符號(hào)常量。恰當(dāng)命名的符號(hào)常量,除具有宏定義的上述優(yōu)點(diǎn)外,還能恰當(dāng)命名的符號(hào)常量,除具有宏定義的上述優(yōu)點(diǎn)外,還能表達(dá)出它

7、所代表常量的實(shí)際含義,從而增強(qiáng)程序的可讀性。表達(dá)出它所代表常量的實(shí)際含義,從而增強(qiáng)程序的可讀性。#define EOF -1 /*文件尾文件尾*/#define NULL 0/*空指針空指針*/#define MIN 1 /*極小值極小值*/#define MAX 31 /*極大值極大值*/#define STEP 2 /*步長(zhǎng)步長(zhǎng)*/ Return帶參數(shù)的宏定義帶參數(shù)的宏定義1帶參宏定義的一般格式帶參宏定義的一般格式#define 宏名宏名(形參表形參表) 字符串字符串2帶參宏的調(diào)用和宏展開帶參宏的調(diào)用和宏展開(1)調(diào)用格式:宏名)調(diào)用格式:宏名(實(shí)參表實(shí)參表)(2)宏展開:用宏調(diào)用提供的實(shí)

8、參字符串,)宏展開:用宏調(diào)用提供的實(shí)參字符串,直接置換宏定義命令行中相應(yīng)形參字符串,非形直接置換宏定義命令行中相應(yīng)形參字符串,非形參字符保持不變。參字符保持不變。例例9.2#define X(a) a*amain() printf(“%dn”,X(4+5);程序運(yùn)行的結(jié)果?程序運(yùn)行的結(jié)果? 29?81?程序運(yùn)行結(jié)果為:程序運(yùn)行結(jié)果為:29,并非,并非81例例9.2#define X(a) (a)*(a)main() printf(“%dn”,X(4+5);程序運(yùn)行的結(jié)果?程序運(yùn)行的結(jié)果? 程序運(yùn)行結(jié)果為:程序運(yùn)行結(jié)果為:81例例9.3#define PRINT(v) printf(“v=%dt

9、”,v)main() int a=1,b=2; PRINT(a); PRINT(b); (程序運(yùn)行結(jié)果為:(程序運(yùn)行結(jié)果為:v=1 v=2,并非,并非a=1 b=2)3. 帶參數(shù)宏的帶參數(shù)宏的使用說明使用說明(1)定義有參宏時(shí),宏名與左圓括號(hào)之間不能留有空格。)定義有參宏時(shí),宏名與左圓括號(hào)之間不能留有空格。否則,編譯系統(tǒng)將空格以后的所有字符均作為替代字符串,否則,編譯系統(tǒng)將空格以后的所有字符均作為替代字符串,而將該宏視為無參宏。而將該宏視為無參宏。(2)有參宏的展開,只是將實(shí)參作為字符串,簡(jiǎn)單地置換)有參宏的展開,只是將實(shí)參作為字符串,簡(jiǎn)單地置換形參字符串,而不做任何語法檢查。在定義有參宏時(shí),

10、在所形參字符串,而不做任何語法檢查。在定義有參宏時(shí),在所有形參外和整個(gè)字符串外,均加一對(duì)圓括號(hào)。有形參外和整個(gè)字符串外,均加一對(duì)圓括號(hào)。4. 區(qū)分帶參數(shù)的宏和函數(shù)區(qū)分帶參數(shù)的宏和函數(shù) 雖然有參宏與有參函數(shù)確有相似之處,但不同之處更多,雖然有參宏與有參函數(shù)確有相似之處,但不同之處更多,主要有以下幾個(gè)方面:主要有以下幾個(gè)方面:1)調(diào)用有參函數(shù)時(shí),是先求出實(shí)參的值,然后再?gòu)?fù)制一份)調(diào)用有參函數(shù)時(shí),是先求出實(shí)參的值,然后再?gòu)?fù)制一份給形參。而展開有參宏時(shí),只是將實(shí)參簡(jiǎn)單地置換形參。給形參。而展開有參宏時(shí),只是將實(shí)參簡(jiǎn)單地置換形參。2)在有參函數(shù)中,形參是有類型的,所以要求實(shí)參的類型)在有參函數(shù)中,形參是

11、有類型的,所以要求實(shí)參的類型與其一致;而在有參宏中,形參是沒有類型信息的,因此與其一致;而在有參宏中,形參是沒有類型信息的,因此用于置換的實(shí)參,什么類型都可以。有時(shí),可利用有參宏用于置換的實(shí)參,什么類型都可以。有時(shí),可利用有參宏的這一特性,實(shí)現(xiàn)通用函數(shù)功能。的這一特性,實(shí)現(xiàn)通用函數(shù)功能。4. 區(qū)分帶參數(shù)的宏和函數(shù)區(qū)分帶參數(shù)的宏和函數(shù)3)使用有參函數(shù),無論調(diào)用多少次,都不會(huì)使目標(biāo)程)使用有參函數(shù),無論調(diào)用多少次,都不會(huì)使目標(biāo)程序變長(zhǎng),但每次調(diào)用都要占用系統(tǒng)時(shí)間進(jìn)行調(diào)用現(xiàn)場(chǎng)保序變長(zhǎng),但每次調(diào)用都要占用系統(tǒng)時(shí)間進(jìn)行調(diào)用現(xiàn)場(chǎng)保護(hù)和現(xiàn)場(chǎng)恢復(fù);而使用有參宏,由于宏展開是在編譯時(shí)護(hù)和現(xiàn)場(chǎng)恢復(fù);而使用有參宏,

12、由于宏展開是在編譯時(shí)進(jìn)行的,所以不占運(yùn)行時(shí)間,但是每引用進(jìn)行的,所以不占運(yùn)行時(shí)間,但是每引用1次,都會(huì)使次,都會(huì)使目標(biāo)程序增大目標(biāo)程序增大1次。次。 Return9.2 文件包含文件包含1文件包含的概念文件包含的概念文件包含是指,一個(gè)源文件可以將另一個(gè)源文件的全部?jī)?nèi)容包文件包含是指,一個(gè)源文件可以將另一個(gè)源文件的全部?jī)?nèi)容包含進(jìn)來。含進(jìn)來。2文件包含處理命令的格式文件包含處理命令的格式include “包含文件名包含文件名” 或或 include 兩種格式的區(qū)別僅在于:兩種格式的區(qū)別僅在于:(1)使用雙引號(hào):系統(tǒng)首先到當(dāng)前目錄下查找被包含文件,)使用雙引號(hào):系統(tǒng)首先到當(dāng)前目錄下查找被包含文件,如

13、果沒找到,再到系統(tǒng)指定的如果沒找到,再到系統(tǒng)指定的“包含文件目錄包含文件目錄”(由用戶在配置環(huán)(由用戶在配置環(huán)境時(shí)設(shè)置)去查找。境時(shí)設(shè)置)去查找。(2)使用尖括號(hào):直接到系統(tǒng)指定的)使用尖括號(hào):直接到系統(tǒng)指定的“包含文件目錄包含文件目錄”去查去查找。一般地說,使用雙引號(hào)比較保險(xiǎn)。找。一般地說,使用雙引號(hào)比較保險(xiǎn)。 3文件包含的優(yōu)點(diǎn)文件包含的優(yōu)點(diǎn)4使用說明使用說明Return文件包含的優(yōu)點(diǎn)文件包含的優(yōu)點(diǎn) 一個(gè)大程序,通常分為多個(gè)模塊,并由多個(gè)程序員分別編程。一個(gè)大程序,通常分為多個(gè)模塊,并由多個(gè)程序員分別編程。有了文件包含處理功能,就可以將多個(gè)模塊共用的數(shù)據(jù)(如符有了文件包含處理功能,就可以將多

14、個(gè)模塊共用的數(shù)據(jù)(如符號(hào)常量和數(shù)據(jù)結(jié)構(gòu))或函數(shù),集中到一個(gè)單獨(dú)的文件中。這樣,號(hào)常量和數(shù)據(jù)結(jié)構(gòu))或函數(shù),集中到一個(gè)單獨(dú)的文件中。這樣,凡是要使用其中數(shù)據(jù)或調(diào)用其中函數(shù)的程序員,只要使用文件凡是要使用其中數(shù)據(jù)或調(diào)用其中函數(shù)的程序員,只要使用文件包含處理功能,將所需文件包含進(jìn)來即可,不必再重復(fù)定義它包含處理功能,將所需文件包含進(jìn)來即可,不必再重復(fù)定義它們,從而減少重復(fù)勞動(dòng)。們,從而減少重復(fù)勞動(dòng)。Return使用說明(1)編譯預(yù)處理時(shí),預(yù)處理程序?qū)⒉檎抑付ǖ谋话募?,并將其)編譯預(yù)處理時(shí),預(yù)處理程序?qū)⒉檎抑付ǖ谋话募?,并將其?fù)制到復(fù)制到#include命令出現(xiàn)的位置上。命令出現(xiàn)的位置上。(2)

15、常用在文件頭部的被包含文件,稱為)常用在文件頭部的被包含文件,稱為“標(biāo)題文件標(biāo)題文件”或或“頭部文頭部文件件”,常以,常以“h”(head)作為后綴,簡(jiǎn)稱頭文件。在頭文件中,)作為后綴,簡(jiǎn)稱頭文件。在頭文件中,除可包含宏定義外,還可包含外部變量定義、結(jié)構(gòu)類型定義等。除可包含宏定義外,還可包含外部變量定義、結(jié)構(gòu)類型定義等。(3)一條包含命令,只能指定一個(gè)被包含文件。如果要包含)一條包含命令,只能指定一個(gè)被包含文件。如果要包含n個(gè)文件,個(gè)文件,則要用則要用n條包含命令。條包含命令。(4)文件包含可以嵌套,即被包含文件中又包含另一個(gè)文件。)文件包含可以嵌套,即被包含文件中又包含另一個(gè)文件。 (5)被

16、包含文件與其所在文件,在編譯后成為同一個(gè)文件。()被包含文件與其所在文件,在編譯后成為同一個(gè)文件。(f1中中包含包含f2,若,若f2中有全局變量,則在中有全局變量,則在f1中有效,不必用中有效,不必用extern聲聲明)明)Return9.3 條件編譯條件編譯一般源程序中所有的行都參加編譯。一般源程序中所有的行都參加編譯。 條件編譯:程序中的一部分內(nèi)容在滿足一定的條件下才能條件編譯:程序中的一部分內(nèi)容在滿足一定的條件下才能進(jìn)行編譯,即對(duì)一部分內(nèi)容指定編譯條件。進(jìn)行編譯,即對(duì)一部分內(nèi)容指定編譯條件。 條件編譯可有效地提高程序的可移植性,并廣泛地應(yīng)用在條件編譯可有效地提高程序的可移植性,并廣泛地應(yīng)

17、用在商業(yè)軟件中,為一個(gè)程序提供各種不同的版本。商業(yè)軟件中,為一個(gè)程序提供各種不同的版本。1. #ifdef #endif和和#ifndef #endif命令命令2. #if #endifReturn#ifdef #endif和#ifndef #endif命令1一般格式一般格式 ifdef 標(biāo)識(shí)符標(biāo)識(shí)符 程序段程序段1; else 程序段程序段2; endif2功能:當(dāng)功能:當(dāng)“標(biāo)識(shí)符標(biāo)識(shí)符”已經(jīng)被已經(jīng)被#define命令定義過,則編譯程序命令定義過,則編譯程序段段1,否則編譯程序段,否則編譯程序段2。(。(1)在不同的系統(tǒng)中,一個(gè))在不同的系統(tǒng)中,一個(gè)int 型數(shù)據(jù)占用型數(shù)據(jù)占用的內(nèi)存字節(jié)數(shù)可能是不同的。的內(nèi)存字節(jié)數(shù)可能是不同的。(2)利用條件編譯,還可使同一源程序即)利用條件編譯,還可使同一源程序即適合于調(diào)試(進(jìn)行程序跟蹤、打印較多的狀態(tài)或錯(cuò)誤信息),又適合高適合于調(diào)試(進(jìn)行程序跟蹤、打印較多的狀態(tài)或錯(cuò)誤信息),又適合高效執(zhí)行要求。效執(zhí)行要求。 3關(guān)于關(guān)于#ifndef #endif命令命令格式與格式與#ifdef #endif命令一樣,功能正好與之相反。命令一樣,功能正好與之相反。 Return#if #endif1一般格式一般格式 if 常量表達(dá)式常量表達(dá)式 程序段程序段1; else 程序段程序段2;

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論