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