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

下載本文檔

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

文檔簡介

1、9.1 9.1 宏定義宏定義 9.2 9.2 “文件包含文件包含”處理處理 9.3 9.3 條件編譯條件編譯 教學(xué)重點(diǎn)教學(xué)重點(diǎn)宏定義;宏定義;“文件包含文件包含”處理。處理。教學(xué)難點(diǎn)教學(xué)難點(diǎn)宏定義;宏定義;“文件包含文件包含”處理。處理。 目的目的: : 為了簡化程序的編寫,為了簡化程序的編寫,提高程序的可移植性、可讀性、模提高程序的可移植性、可讀性、模塊化。塊化。 C C語言設(shè)計(jì)了若干命令語言設(shè)計(jì)了若干命令編編譯預(yù)處理命令,并可出現(xiàn)于程序當(dāng)譯預(yù)處理命令,并可出現(xiàn)于程序當(dāng)中。中。處理流程處理流程: 第一次編譯掃描時(shí),將預(yù)編譯命令處理完,第一次編譯掃描時(shí),將預(yù)編譯命令處理完,然后再進(jìn)行正式編譯,

2、生成目標(biāo)代碼。然后再進(jìn)行正式編譯,生成目標(biāo)代碼。1. 宏定義命令宏定義命令; 有三種類型的預(yù)處理命令有三種類型的預(yù)處理命令:為了與為了與C語句區(qū)別,這些命令均以語句區(qū)別,這些命令均以“#”開頭。開頭。2. 文件包含命令文件包含命令; 3. 條件編譯命令。條件編譯命令。9.1 9.1 宏定義宏定義簡化程序的書寫,提高可讀性、可移植性。簡化程序的書寫,提高可讀性、可移植性。宏定義分為宏定義分為: 無參數(shù)無參數(shù)和和有參數(shù)有參數(shù)二種形式。二種形式。9.1.1 9.1.1 不帶參數(shù)的宏定義不帶參數(shù)的宏定義# define # define 標(biāo)識(shí)符標(biāo)識(shí)符 字符串表達(dá)式字符串表達(dá)式例如:例如:#includ

3、e #define L (x*x + 2*x + x)main()int x, y;printf(“ input a number:” );scanf(%d, &x);y=L*L + 2*L + 10;printf(y=%d n, y);上例中,上例中,#define L (x*x+2*x+x),在,在yL*L+2*L+10;中作;中作了宏調(diào)用。在預(yù)處理時(shí)經(jīng)宏展開后該語句變?yōu)椋毫撕暾{(diào)用。在預(yù)處理時(shí)經(jīng)宏展開后該語句變?yōu)椋簓(x*x+2*x+x)*(x*x+2*x+x)+2*(x*x+2*x+x)+10;注意幾點(diǎn):注意幾點(diǎn): (1) 宏定義是用宏名來表示一個(gè)字符串,在宏展開時(shí)又以宏定義是用宏名來表

4、示一個(gè)字符串,在宏展開時(shí)又以該字該字 符串取代宏名,只是一種簡單的代換。符串取代宏名,只是一種簡單的代換。 (2) 宏定義不是說明或語句,在行末不加分號(hào)。宏定義不是說明或語句,在行末不加分號(hào)。 (3) 宏定義必須寫在函數(shù)之外,其作用域?yàn)楹甓x命令宏定義必須寫在函數(shù)之外,其作用域?yàn)楹甓x命令起到源程序結(jié)束。起到源程序結(jié)束。 (4) 用引號(hào)括起來的宏名,預(yù)處理程序不對其作宏代換。用引號(hào)括起來的宏名,預(yù)處理程序不對其作宏代換。 (5)宏定義允許嵌套,在宏定義的字符串中可以使用已經(jīng)宏定義允許嵌套,在宏定義的字符串中可以使用已經(jīng)定義的宏名。在宏展開時(shí)由預(yù)處理程序?qū)訉哟鷵Q。定義的宏名。在宏展開時(shí)由預(yù)處理程

5、序?qū)訉哟鷵Q。 (6)宏名一般用大寫字母表示,以便于與變量區(qū)別。宏名一般用大寫字母表示,以便于與變量區(qū)別。9.1.2 9.1.2 帶參數(shù)的宏定義帶參數(shù)的宏定義 適用于字符串表達(dá)式序列中有變化的字符,將這部分字適用于字符串表達(dá)式序列中有變化的字符,將這部分字符可定義為參數(shù)。符可定義為參數(shù)。#define 宏名宏名(形參表形參表) 字符串字符串 帶參宏定義的一般形式為:帶參宏定義的一般形式為: 例如例如: #define L(x) (x*x+2*x+x) /*帶參數(shù)宏定義帶參數(shù)宏定義*/ 宏調(diào)用:宏調(diào)用:y=L(5); 在宏調(diào)用時(shí),用實(shí)參在宏調(diào)用時(shí),用實(shí)參5去代替形參去代替形參x,經(jīng)預(yù)處理宏展開,經(jīng)

6、預(yù)處理宏展開后的語句為:后的語句為:y=(5*5+2*5+5);例例 :#include #define MAX(a,b) (ab)?a:bmain() int x,y,max;scanf(%d%d,&x,&y);max=MAX(x,y);printf(max=%d n,max);說明:說明:上例程序中,表達(dá)式上例程序中,表達(dá)式 (ab)?a:b 由宏名由宏名MAX表示,形參表示,形參a,b均出現(xiàn)在條件表達(dá)式中。程序中:均出現(xiàn)在條件表達(dá)式中。程序中:max=MAX(x,y);為宏調(diào)用,實(shí)參為宏調(diào)用,實(shí)參x,y將代換形參將代換形參a,b。宏展開后該語句為:。宏展開后該語句為:max=(xy) ?

7、 x:y;注意幾點(diǎn):注意幾點(diǎn): (1)宏定義中,宏名和形參表之間不能有空格出現(xiàn)。宏定義中,宏名和形參表之間不能有空格出現(xiàn)。例如:例如:#define MAX (a,b)(ab)?a:b 將被認(rèn)為宏名將被認(rèn)為宏名MAX代表的代表的字符串是字符串是 (a,b)(ab)?a:b,是無參宏定義。,是無參宏定義。 (2)在帶參宏定義中,形式參數(shù)不同于函數(shù)中的形參,帶參宏在帶參宏定義中,形式參數(shù)不同于函數(shù)中的形參,帶參宏定義中的參數(shù)不是變量,只是在宏調(diào)用時(shí)用實(shí)參的符號(hào)去代換定義中的參數(shù)不是變量,只是在宏調(diào)用時(shí)用實(shí)參的符號(hào)去代換形參,即只是符號(hào)代換。所以,不存在值傳遞的問題。形參,即只是符號(hào)代換。所以,不存

8、在值傳遞的問題。 (3)在宏定義中的形參是標(biāo)識(shí)符,而宏調(diào)用中的實(shí)參可以是在宏定義中的形參是標(biāo)識(shí)符,而宏調(diào)用中的實(shí)參可以是表達(dá)式。表達(dá)式。 (4)在宏定義中的形參最好用括號(hào)括起來,以避免出錯(cuò)。在宏定義中的形參最好用括號(hào)括起來,以避免出錯(cuò)。 為了保證宏代換的正確性,應(yīng)該給宏定義中的表示表達(dá)為了保證宏代換的正確性,應(yīng)該給宏定義中的表示表達(dá)式的字符串加上括號(hào),如:式的字符串加上括號(hào),如:#define L(x) (x)*(x)+2)宏調(diào)用:宏調(diào)用:y=lL(a+5);宏代換后:宏代換后:yl(a+5)*(a+5)+2);如果字符串沒有加上括號(hào),宏代換后會(huì)得到完全不同的表達(dá)式:如果字符串沒有加上括號(hào),宏

9、代換后會(huì)得到完全不同的表達(dá)式:y=l(a+5)*(a+5)+2; (5)注意注意帶參宏與帶參函數(shù)的區(qū)別。帶參宏與帶參函數(shù)的區(qū)別。9.2 “文件包含文件包含”處理處理 C語言允許在一個(gè)文件預(yù)編譯時(shí),將另一個(gè)文語言允許在一個(gè)文件預(yù)編譯時(shí),將另一個(gè)文件原封不動(dòng)地包含進(jìn)來。件原封不動(dòng)地包含進(jìn)來。目的目的: 、當(dāng)函數(shù)不在一個(gè)文件中,既可用、當(dāng)函數(shù)不在一個(gè)文件中,既可用link連接連接編譯后的編譯后的obj文件,也可用文件,也可用“ 文件包含文件包含”方式。方式。 、當(dāng)一組符號(hào)常量的定義為公用時(shí),可作、當(dāng)一組符號(hào)常量的定義為公用時(shí),可作為一個(gè)獨(dú)立的文件被其它文件包含。為一個(gè)獨(dú)立的文件被其它文件包含。格式格

10、式: # include 文件名文件名# include f2.c main ( ) 例例:f1.cf2.c:預(yù)編譯后預(yù)編譯后::main ( ) f1.c為f2.c中的內(nèi)容再進(jìn)行正式編譯1. 一個(gè)一個(gè)include只能寫一個(gè)文件,包含多個(gè)文件需多個(gè)只能寫一個(gè)文件,包含多個(gè)文件需多個(gè)include 、只在只在f1.c中用中用#include. #include f2.c #include f3.c、分別在分別在f1.c, f2.c中用中用#include 在在f1.c中中: #include f2.c 在在f2.c中中: #include f3.c2. 當(dāng)當(dāng)f1.c包含包含f2.c,而而f2.

11、c又包含又包含f3.c時(shí),有兩種包含形式時(shí),有兩種包含形式:3. 一般用一般用 .h 擴(kuò)展名命名被包含文件。擴(kuò)展名命名被包含文件。 h為為head之意以與一之意以與一般般 .c 文件區(qū)別。如系統(tǒng)文件區(qū)別。如系統(tǒng)stdio.h.系統(tǒng)系統(tǒng) .h 文件在子目錄文件在子目錄INCLUDE下。下。4. #include后的文件名既可用后的文件名既可用 , 也可用也可用,兩者區(qū)別,兩者區(qū)別: “ ”首先在當(dāng)前目錄中找,然后再去標(biāo)準(zhǔn)目錄中找。首先在當(dāng)前目錄中找,然后再去標(biāo)準(zhǔn)目錄中找。 只在標(biāo)準(zhǔn)目錄只在標(biāo)準(zhǔn)目錄(include目錄目錄)中找。中找。 5. 被包含文件和包含文件最后形成一個(gè)文件。因此被包含文件和

12、包含文件最后形成一個(gè)文件。因此,全局變量全局變量作用域?yàn)檎麄€(gè)文件。不必用作用域?yàn)檎麄€(gè)文件。不必用extern說明。說明。9.3 條件編譯條件編譯 有時(shí),有時(shí),C程序的一部分語句是否起作用要根據(jù)程序的一部分語句是否起作用要根據(jù)一定的條件,即由條件而決定是否起作用。一定的條件,即由條件而決定是否起作用。例如例如: 、 調(diào)試程序時(shí)調(diào)試程序時(shí),需加多條需加多條printf,但調(diào)試完則要但調(diào)試完則要一一刪除。一一刪除。 、 有的語句也視條件而決定其具體形式。有的語句也視條件而決定其具體形式。 條件編譯命令的三種形式條件編譯命令的三種形式:形式形式1 # ifdef 標(biāo)識(shí)符標(biāo)識(shí)符 程序段程序段1 # el

13、se 程序段程序段2 # endif功能功能:當(dāng)標(biāo)識(shí)符在此之前被定義過:當(dāng)標(biāo)識(shí)符在此之前被定義過 (即用即用#define定義過定義過),則編譯程序段,則編譯程序段1,否則編譯程序段,否則編譯程序段2。其中其中: 程序段既可為語句組,也可為命令行。程序段既可為語句組,也可為命令行。另:另:#else 后面部分可沒有,但后面部分可沒有,但#endif保留。保留。例例: 為了調(diào)試程序,加上以下條件編譯為了調(diào)試程序,加上以下條件編譯 # ifdef DEBUG printf(x=%d, y=%d, z=%d,x, y, z ); # endif只要在此之前有只要在此之前有: # define DEB

14、UG 則編譯則編譯 printf( x=%d, y=%d, z=%d, x, y, z);例例:/*-exp11_5.c-*/includedefine EN printf(Please input number:n)main( ) int a=123, b=456;#ifdef EN prinft(This is test :a=%dn, a);#else prinft(This is test :b=%dn, b);#endif編譯時(shí)會(huì)有警告:編譯時(shí)會(huì)有警告:b is assigned a value that is never used運(yùn)行結(jié)果運(yùn)行結(jié)果:This is test :a=1

15、23形式形式2 #ifndef 標(biāo)識(shí)符標(biāo)識(shí)符 程序段程序段1 #else 程序段程序段2 #endif功能功能: 與形式與形式1的條件正好相反,即的條件正好相反,即: 當(dāng)標(biāo)識(shí)符未當(dāng)標(biāo)識(shí)符未被定義,則編譯程序段被定義,則編譯程序段1, 否則編譯程序段否則編譯程序段2。例例:/*-exp11_5.c-*/includedefine EN printf(Please input number:n)main( ) int a=123, b=456;#ifndef EN prinft(This is test :a=%dn, a);#else prinft(This is test :b=%dn, b)

16、;#endif編譯時(shí)會(huì)有警告:編譯時(shí)會(huì)有警告:a is assigned a value that is never used運(yùn)行結(jié)果運(yùn)行結(jié)果:This is test :b=456形式形式3 #if 表達(dá)式表達(dá)式 程序段程序段1 #else 程序段程序段2 #endif功能功能: 當(dāng)表達(dá)式當(dāng)表達(dá)式 0,則編譯程序段,則編譯程序段1,否則編譯程,否則編譯程序段序段2。 例例: 輸入一任意字符串,需將其全部轉(zhuǎn)化為輸入一任意字符串,需將其全部轉(zhuǎn)化為大寫字母大寫字母,或者將其轉(zhuǎn)化為小寫字母?;蛘邔⑵滢D(zhuǎn)化為小寫字母。 只編一個(gè)程序,只編一個(gè)程序, 程序中用條件編譯,決定程序中用條件編譯,決定是全部轉(zhuǎn)為大寫字母還是小寫字母。是全部轉(zhuǎn)為大寫字母還是小寫字母。 i=0; while

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論