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

下載本文檔

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

文檔簡(jiǎn)介

C語言編程實(shí)戰(zhàn)寶典大家好?。?!第10章

預(yù)處理命令預(yù)處理器的行為是由指令所控制的。這些指令是由#字符開頭的,可以說,預(yù)處理指令以符號(hào)#作為行的開關(guān)。預(yù)處理指令可以出現(xiàn)在源文件中的任何位置,指令的作用域從其定義的位置開始直到本文件結(jié)尾。10.1預(yù)處理器的工作方式#define指令定義了一個(gè)宏,宏是一個(gè)名字,它通常指代某一類型的常量。預(yù)處理器會(huì)將宏的名字和它的定義存儲(chǔ)在一起,當(dāng)這個(gè)宏在其后的程序中用到的時(shí)候,預(yù)處理器就“擴(kuò)展”該宏,即將宏名用宏定義中的值替換掉。#include指令告訴編譯器去打開一個(gè)特定的文件,并將這個(gè)文件的內(nèi)容作為正在編譯的文件的一部分包含進(jìn)來。/*求b值*/#include<stdio.h>

#defineLEN20#defineSCALE(3.0/5.0)

main(){ floata,b; printf("Entervaluea:"); scanf("%f",&a);

b=(a+LEN)*SCALE; printf("Thevalueofbis:%f\n",b);}空行空行從文件stdio.h中引入的行空行空行空行空行main(){ floata,b; printf("Entervaluea:"); scanf("%f",&a);

b=(a+20)*(3.0/5.0); printf("Thevalueofbis:%f\n",b);}10.2預(yù)處理指令預(yù)處理的指令主要類型有3種,具體如下:1.宏定義。#define和#undef指令。2.文件包含。#include指令3.條件編譯。#if、#ifdef、#ifndef、#elif、#else和#endif指令。10.2預(yù)處理指令1.所有的預(yù)處理指令都以#開頭。2.預(yù)處理指令的各個(gè)符號(hào)之間可以插入任意數(shù)量的空格或橫向制表符。3.預(yù)處理指令總是在第一個(gè)換行符出現(xiàn)時(shí)結(jié)束,除非明確指明下一行仍然屬于該指令。4.預(yù)處理指令可以在程序的任何位置出現(xiàn)。5.預(yù)處理指令的注釋可以與該指令位于同一行。10.3宏定義宏可以帶參數(shù),也可以不帶參數(shù),C語言編譯器對(duì)帶參數(shù)的宏提供了支持。10.3.1不帶參數(shù)的宏不帶參數(shù)的宏定義格式為:#define標(biāo)識(shí)符替換列表當(dāng)預(yù)處理器在程序中發(fā)現(xiàn)了宏的實(shí)例后,總會(huì)用替換列表來代替該宏(即替換宏名)。從宏變成最終的替換文本的過程稱為宏展開。對(duì)不帶參數(shù)的宏的幾點(diǎn)說明:(1)宏名通常使用大寫字母來表示,以便與變量名相區(qū)分。(2)當(dāng)程序中需要多次重復(fù)書寫某個(gè)字符串時(shí)可以考慮使用宏。(3)預(yù)處理器進(jìn)行宏展開時(shí)只做替換,而不會(huì)進(jìn)行正確性檢查,如果宏定義中的替換文本寫錯(cuò)了,那么宏展開時(shí)也會(huì)照樣進(jìn)行替換。(4)宏定義不是C語言的語句,在行末結(jié)尾處不需要加分號(hào),否則會(huì)連同分號(hào)一起進(jìn)行替換。(5)宏名的有效作用范圍為從該#define命令之后到本源文件結(jié)束。(6)如果想在程序中的某個(gè)位置終止宏定義的作用域則可以使用#undef命令。10.3.2帶參數(shù)的宏帶參數(shù)的宏不是只進(jìn)行簡(jiǎn)單的字符串替換,還需要進(jìn)行參數(shù)替換。帶參數(shù)的宏定義格式為:#define標(biāo)識(shí)符(x1,x2,...,xn)替換列表10.3.2帶參數(shù)的宏當(dāng)預(yù)處理器碰到一個(gè)帶參數(shù)的宏時(shí),它首先會(huì)將其定義存儲(chǔ)起來。在后面的程序中,如果出現(xiàn)了“

宏名(y1,y2,...yn)”格式的宏調(diào)用(其中y1,y2,...yn則是一系列參數(shù)值),則預(yù)處理器就會(huì)使用已存儲(chǔ)起來的宏的替換列表進(jìn)行替換,并使用參數(shù)值y1來替換x1,參數(shù)值y2來替換x2,...,參數(shù)值yn來替換xn。10.3.2帶參數(shù)的宏假設(shè)定義了如下的宏:#defineAREA(x)x*x如果在后續(xù)的程序中出現(xiàn)了如下的語句:z=AREA(5);那么預(yù)編譯器會(huì)將其替換為:z=5*5;10.3.3#運(yùn)算符宏定義中還可以包含兩個(gè)特殊的運(yùn)算符:#和##。它們對(duì)應(yīng)的運(yùn)算會(huì)在預(yù)處理時(shí)被執(zhí)行。#符號(hào)作為一個(gè)預(yù)處理運(yùn)算符,可以將宏的參數(shù)轉(zhuǎn)換為字符串的字面量。它只能出現(xiàn)在帶參數(shù)宏的替換列表中。10.3.3#運(yùn)算符#include<stdio.h>#defineAREA(x)printf("Theareaof"#x"is%d\n",((x)*(x)));main(){

inty=3;

AREA(y);

AREA(2+5);}該程序輸出如下:Theareaofyis9Theareaof2+5is4910.3.4##運(yùn)算符##運(yùn)算符也可以用于宏定義中的替換部分,它可以將兩個(gè)符號(hào)組合成為一個(gè)符號(hào)。例如,可以定義下面的宏:#defineNAME(n)a##n如果宏調(diào)用為NAME(3),那么這個(gè)宏可以展開為:a310.3.5取消宏定義可以使用#undef命令來終止宏定義的作用域。假設(shè)有如下定義:#defineNUM50則指令:#undefNUM會(huì)取消該定義。此后就可以重新定義NUM宏,給它一個(gè)新值。10.3.6宏和函數(shù)很多實(shí)際問題既可以使用帶參數(shù)的宏來解決,也可以使用函數(shù)來完成。那么到底應(yīng)該選擇哪一種呢?這沒有硬性的規(guī)定,但是有些規(guī)則可以作為參考。在使用宏時(shí),如果不謹(jǐn)慎的話就可能會(huì)出現(xiàn)一些無法預(yù)料的結(jié)果,因此宏在某些情況下比一般的函數(shù)要更復(fù)雜。對(duì)于某個(gè)具體問題是選擇宏還是函數(shù)實(shí)際上是對(duì)時(shí)間和空間的權(quán)衡。頻繁的函數(shù)調(diào)用比使用宏要更費(fèi)時(shí)。宏所具有的一個(gè)優(yōu)點(diǎn)就是它不會(huì)對(duì)參數(shù)的類型進(jìn)行檢查,因此一個(gè)宏可以用于多種類型。如int類型和float類型的參數(shù)都可以使用宏AREA(x)。10.3.7宏定義(#define)和

類型定義(typedef)宏定義用來替代變量或函數(shù),是由源程序中宏定義命令完成的。類型定義使用typedef關(guān)鍵字,它可以定義一種類型的新別名,它不同于宏,不是簡(jiǎn)單的字符串替換。10.4條件編譯在編寫程序時(shí),有時(shí)候希望只對(duì)其中的一部分內(nèi)容在滿足某個(gè)條件的情況下才進(jìn)行編譯,這就是條件編譯。10.4.1#if…#endif指令#if...#endif指令的格式為:#if表達(dá)式

程序段#endif它的作用是當(dāng)指定的表達(dá)式值為真(非零)時(shí)就對(duì)程序段進(jìn)行編譯,否則不編譯該程序段。10.4.1#if…#endif指令首先定義一個(gè)宏CONDITION,并給它一個(gè)非0的值:#defineCONDITION1接下來,使用#if...#endif指令:#ifCONDITION printf("correct");#endif10.4.2#if…#else…#endif指令#if...#else...#endif指令的格式為:#if表達(dá)式

程序段1#else

程序段2#endif它的作用是當(dāng)指定的表達(dá)式值為真(非零)時(shí)就對(duì)程序段1進(jìn)行編譯,否則編譯程序段2。10.4.3#if…#elif…#endif指令#if...#elif..#endif指令的格式為:#if表達(dá)式1

程序段1#elif表達(dá)式2

程序段2 ...#elif表達(dá)式n

程序段n#endif10.4.3#if…#elif…#endif指令#ifCONDITION==1 printf("up");#elifCONDITION==2 printf("down");#elifCONDITON==3 printf("loop");#endif10.4.4#ifdef…#endif指令#ifdef指令用于測(cè)試一個(gè)標(biāo)識(shí)符是否已經(jīng)定義為宏,它的使用方法與#if指令類似。其格式為:#ifdef標(biāo)識(shí)符

程序段#endif10.4.4#ifdef…#endif指令還可以在#ifdef和#endif之間添加#else語句,格式為:#ifdef標(biāo)識(shí)符

程序段1#else

程序段2#endif10.4.5#ifndef…#endif指令#ifndef指令與#ifdef指令的作用相反,它測(cè)試的是標(biāo)識(shí)符是否沒有被定義為宏。其格式為:#ifndef標(biāo)識(shí)符

程序段#endif10.4.5#ifndef…#endif指令還可以在#ifndef和#endif之間添加#else語句,格式為:#ifndef標(biāo)識(shí)符

程序段1#else

程序段2#endif此時(shí)表示若標(biāo)識(shí)符未被定義為宏,則編譯程序段1,否則編譯程序段2。10.5文件包含所謂文件包含指的是一個(gè)源文件可以將另外一個(gè)源文件的全部文件都包含進(jìn)來,即將另外一個(gè)文件包含到本文件中。C

溫馨提示

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