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