宏的使用
很多程序員不知道C中的“宏”到底是什么意思?特別是當(dāng)宏有參數(shù)的時(shí)候,經(jīng)常把宏和函數(shù)混淆。我想在這里我還是先講講“宏”,宏只是一種定義,他定義了一個(gè)語(yǔ)句塊,當(dāng)程序編譯時(shí),編譯器首先要執(zhí)行一個(gè)“替換”源程序的動(dòng)作,把宏引用的地方替換成宏定義的語(yǔ)句塊,就像文本文件替換一樣。這個(gè)動(dòng)作術(shù)語(yǔ)叫“宏的展開(kāi)”。使用宏是比較“危險(xiǎn)”的,因?yàn)槟悴恢?span id="hdaxudx" class="GramE" twffan="done">宏展開(kāi)后會(huì)是什么一個(gè)樣子。例如下面這個(gè)宏:
#define MAX(a, b) a>b?a:b
當(dāng)我們這樣使用宏時(shí),沒(méi)有什么問(wèn)題: MAX( num1, num2 ); 因?yàn)?span id="ahtfgau" class="GramE" twffan="done">宏展開(kāi)后變成 num1>num2?num1:num2;。 但是,如果是這樣調(diào)用的,MAX( 17+32, 25+21); 呢,編譯時(shí)出現(xiàn)錯(cuò)誤,原因是,宏展開(kāi)后變成:17+32>25+21?17+32:25+21,Woh,這是什么啊?
所以,宏在使用時(shí),參數(shù)一定要加上括號(hào),上述的那個(gè)例子改成如下所示就能解決問(wèn)題了。
#define MAX( (a), (b) ) (a)>(b)?(a)b)
即使是這樣,也不這個(gè)宏也還是有Bug,因?yàn)槿绻疫@樣調(diào)用 MAX(i++,j++); , 經(jīng)過(guò)這個(gè)宏以后,i和j都被累加了兩次,這絕不是我們想要的。所以,在宏的使用上還是要謹(jǐn)慎考慮,因?yàn)?span id="xaebcsq" class="GramE" twffan="done">宏展開(kāi)是的結(jié)果是很難讓人預(yù)料的。而且雖然,宏的執(zhí)行很快(因?yàn)闆](méi)有函數(shù)調(diào)用的開(kāi)銷(xiāo)),但宏會(huì)讓源代碼澎漲,使目標(biāo)文件尺寸變大,(如:一個(gè)50行的宏,程序中有1000個(gè)地方用到,宏展開(kāi)后會(huì)很不得了),相反不能讓程序執(zhí)行得更快(因?yàn)閳?zhí)行文件變大,運(yùn)行時(shí)系統(tǒng)換頁(yè)頻繁)。
因此,在決定是用函數(shù),還是用宏時(shí)得要小心。