資源描述:
《c語言之define用法總結(jié)》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在學(xué)術(shù)論文-天天文庫。
1、C語言之define用法總結(jié)#dcfinc&C語言中提供的宏定義命令,K主要目的是為程序員在編程時(shí)提供一定的方便,并能在一定程度上提高程序的運(yùn)行效率。1#define命令剖析1.1#define的概念^define命令是C語言中的一個(gè)宏定義命令,它用來將一個(gè)標(biāo)識(shí)符定義為一個(gè)字符串,該標(biāo)識(shí)符被稱為宏名,被定義的字符串稱為替換文本。緊跟在define后而的標(biāo)識(shí)符稱為宏名。對(duì)于宏名,存在一個(gè)獨(dú)立的名字空間。該命令有兩種格式:一種足簡(jiǎn)單的宏定義,另一種足帶參數(shù)的宏定義。(1)簡(jiǎn)單的宏定義:#define<宏名〉<字符串〉例:#definePI3.141
2、5926(2)帶參數(shù)的宏定義#define<宏名〉(〈參數(shù)表〉)<宏體〉例:#defineA(x)x一個(gè)標(biāo)識(shí)符被宏定義后,該標(biāo)識(shí)符便是一個(gè)宏名。這吋,在程序中ill現(xiàn)的是宏名,在該程序被編譯前,先將宏名用被定義的字符中替換,這稱為宏替換,替換后方進(jìn)行編譯,宏替換是簡(jiǎn)單的替換。1.2宏替換發(fā)生的吋機(jī)為了能夠真正理解#define的作用,讓我們來了解一下對(duì)C語言源程序的處理過程。當(dāng)我們?cè)谝粋€(gè)集成的開發(fā)環(huán)境如TurboC中將編寫好的源程序進(jìn)行編譯吋,實(shí)際經(jīng)過了預(yù)處理、編譯、匯編和連接幾個(gè)過程,見圖1。源程斤;--??預(yù)處理器一一一一修改后的源程/一一
3、編譯器一-??-*-*'匯編程斤;-*-*-*-*匯編器-*—-*-*?可重定位的目標(biāo)程序一違接器->一->一可執(zhí)行的y標(biāo)程序其屮預(yù)處理器產(chǎn)生編譯器的輸出,它實(shí)現(xiàn)以卜‘的功能:(丨)文件包含N以把源程序中W#include擴(kuò)展力文件正文,即把包含的.h文件找到并展開到#include所在處。(2)條件編譯預(yù)處現(xiàn)器根據(jù)等編譯命令及其后的條件,將源程序屮的某部分包含進(jìn)來或排除在外,通常把排除在外的語川轉(zhuǎn)換成空行。(3)宏展開預(yù)處理器將源程序文件屮出現(xiàn)的對(duì)宏的引用展開成相成的宏定義,即木文所說的#defme的功能,由預(yù)處理器來完成。經(jīng)過預(yù)處理器處理的
4、源程序與之前的源程序柯所存不同,在這個(gè)階段所進(jìn)行的工作只是純粹的替換與展開,沒有任何計(jì)算功能,所以在學(xué)習(xí)#defme命令吋只要能真正理解這-?點(diǎn),這樣才不會(huì)對(duì)此命令引起誤解并誤用。1#define使用屮的常見問題解析2.1簡(jiǎn)單宏定義使用中出現(xiàn)的問題在簡(jiǎn)單宏定義的使用屮,當(dāng)替換文木所表示的字符串為一個(gè)表達(dá)式時(shí),稃易引起誤解和誤用。如下例:例1#defmeN2+2(位置在主函數(shù)前)voidmain(){inta=N*N;printf(“%d”,a);}(1)出現(xiàn)問題:在此程序中存在著宏定義命令,宏N代表的字符串是2+2,在程序中有對(duì)宏N的使用,一般
5、同學(xué)在讀該程序時(shí),界易產(chǎn)生的M題是先求解N為2+2=4,然在程序屮計(jì)算a時(shí)使用乘法,即N*N=4*4=16,.其實(shí)該題的結(jié)果為8,為什么結(jié)果冇這么大的偏差?(2)問題解析:如1節(jié)所述,宏展開是在預(yù)處理階段完成的,這個(gè)階段把替換文本只是看作一個(gè)字符串,并不會(huì)有任何的計(jì)算發(fā)生,在展開吋是在宏N出現(xiàn)的地方只是簡(jiǎn)單地使用串2+2來代替N,丼不會(huì)增添任何的符號(hào),所以對(duì)該程序展開后的結(jié)果足a=2+2*2+2,計(jì)算后=8,這就是宏替換的實(shí)質(zhì),如何寫程序才能完成結(jié)果為16的運(yùn)算呢?(3)解決辦法:將宏定義寫成如下形式#defineN(2+2)這樣就可替換成(2
6、+2)*(2+2)=162.2帶參數(shù)的宏定義出現(xiàn)的悶題在帶參數(shù)的宏定義的使用中,極易引起誤解。例如我們需要做個(gè)宏替換能求任何數(shù)的T方,這就耑要使用參數(shù),以便在程序中用實(shí)際參數(shù)來替換宏定義中的參數(shù)。一般學(xué)生容易寫成如下形式:#definearea(x)x*x這在使用中是很容易出現(xiàn)問題的,看如下的程序voidmain(){inty=area(2+2);printf(“%d”,y);}按理說給的參數(shù)是2+2,所得的結(jié)果hV:該為4*4=16,但是錯(cuò)了,因?yàn)樵摮绦虻膶?shí)際結(jié)果為8,仍然是沒能遵循純粹的簡(jiǎn)單替換的規(guī)則,又是先計(jì)算再替換丫,在這道程序里,2+
7、2即為area宏中的參數(shù),應(yīng)該山它來替換宏定義中的X,即替換成2+2*2+2=8了。那如果遵循⑴中的解決辦'法,把2+2括起來,即把宏體中的x括起來,是界可以呢?#definearea(x)(x)*(x),對(duì)于area(2+2),替換為(2+2)*(2+2)=16,可以解決,是對(duì)于area(2+2)/area(2+2)乂會(huì)怎么樣呢,有的學(xué)生一看到這道題馬上給出結(jié)果,因?yàn)榉至朔帜敢粯?,又錯(cuò)了,還是忘Y遵循先替換再計(jì)算的規(guī)則了,這道題替換G會(huì)變?yōu)?2+2)*(2+2)/(2+2)*(2+2)即4*4/4*4按照乘除運(yùn)算規(guī)則,結(jié)果為16/4*4=4*
8、4=16,那應(yīng)該怎么呢?解決方法是在整個(gè)宏體上冉加一個(gè)括兮,area(x)((x)*(x)),不要覺得這沒必要,沒有它,是不行的。要想能夠真正使用好宏