3、emax(x,y)(x)>(y)?(x):(y);這個(gè)定義就將返回兩個(gè)數(shù)中較大的那個(gè),看到了嗎?因?yàn)檫@個(gè)“函數(shù)”沒有類型檢查,就好像一個(gè)函數(shù)模板似的,當(dāng)然,它絕對(duì)沒有模板那么安全就是了。可以作為一個(gè)簡(jiǎn)單的模板來(lái)使用而已。但是這樣做的話存在隱患,例子如下:#defineAdd(a,b)a+b;在一般使用的時(shí)候是沒有問題的,但是如果遇到如:c*Add(a,b)*d的時(shí)候就會(huì)出現(xiàn)問題,代數(shù)式的本意是a+b然后去和c,d相乘,但是因?yàn)槭褂昧薲efine(它只是一個(gè)簡(jiǎn)單的替換),所以式子實(shí)際上變成了c*a+b*d另外
4、舉一個(gè)例子:#definepin(int*);pina,b;本意是a和b都是int型指針,但是實(shí)際上變成int*a,b;a是int型指針,而b是int型變量。這是應(yīng)該使用typedef來(lái)代替define,這樣a和b就都是int型指針了。所以我們?cè)诙x的時(shí)候,養(yǎng)成一個(gè)良好的習(xí)慣,建議所有的層次都要加括號(hào)。3.宏的單行定義(少見用法)#defineA(x)T_##x#defineB(x)#@x#defineC(x)#x我們假設(shè):x=1,則有:A(1)------〉T_1B(1)------〉'1'C(1)---
5、---〉"1"(這里參考了hustli的文章)3.define的多行定義define可以替代多行的代碼,例如MFC中的宏定義(非常的經(jīng)典,雖然讓人看了惡心)#defineMACRO(arg1,arg2)do{/*declarations*/stmt1;stmt2;/*...*/}while(0)/*(notrailing;)*/關(guān)鍵是要在每一個(gè)換行的時(shí)候加上一個(gè)""4.在大規(guī)模的開發(fā)過(guò)程中,特別是跨平臺(tái)和系統(tǒng)的軟件里,define最重要的功能是條件編譯。就是:#ifdefWINDOWS.....
6、.......#endif#ifdefLINUX............#endif可以在編譯的時(shí)候通過(guò)#define設(shè)置編譯環(huán)境5.如何定義宏、取消宏//定義宏#define[MacroName][MacroValue]//取消宏#undef[MacroName]//普通宏#definePI(3.1415926)帶參數(shù)的宏#definemax(a,b)((a)>(b)?(a),(b))關(guān)鍵是十分容易產(chǎn)生錯(cuò)誤,包括機(jī)器和人理解上的差異等等。6.條件編譯#ifdefXXX…(#else)…#endif例如#i
7、fdefDV22_AUX_INPUT#defineAUX_MODE3#else#defineAUY_MODE3#endif#ifndefXXX…(#else)…#endif7.頭文件(.h)可以被頭文件或C文件包含;重復(fù)包含(重復(fù)定義)由于頭文件包含可以嵌套,那么C文件就有可能包含多次同一個(gè)頭文件,就可能出現(xiàn)重復(fù)定義的問題的。通過(guò)條件編譯開關(guān)來(lái)避免重復(fù)包含(重復(fù)定義)例如#ifndef__headerfileXXX__#define__headerfileXXX__…//文件內(nèi)容…#endif?Instan
8、ces:1、防止一個(gè)頭文件被重復(fù)包含#ifndefCOMDEF_H#defineCOMDEF_H?//頭文件內(nèi)容#endif2、重新定義一些類型,防止由于各種平臺(tái)和編譯器的不同,而產(chǎn)生的類型字節(jié)數(shù)差異,方便移植。typedef??unsignedchar??????boolean;????/*Booleanvaluetype.*/typedef??unsignedlongint??uint32;??????/*U