2007年7月12日 星期四

為何不要用 #define - 再加一個例子,這次兇手是微軟!

才剛寫完一篇為何不要用 #define 的實例,立刻又碰上另外一個。先來看個 example:

#include <windows.h>
int MyMax = std::numeric_limits ::max( );
一切看來很正常,compile 起來也很正常。但當你加入一行 #include 後,一切就毀了。這次的兇手是微軟,追蹤下去後,發現原因是在 ,有一行(應該說一堆)大家都知道的爛 macro:

#define max(a,b) (((a) > (b)) ? (a) : (b))


看出問題來了嗎? 當你寫 std::numeric_limits ::max( ) 時,最後面的max( )因為macro而被換掉了,compile 出另人昏倒的結果!

查了一下解法,目前比較常見的做法有兩種,一個是騙過preprocessor,這樣寫就行了:

int MyMax = (

std::numeric_limits ::max)( ); // 用()包起來,就不會被preprocessor換掉了

另一個做法是用Boost,它有一個library叫integer,裡面有integer_traits ::const_max.

總之,別再用 #define 啦!!!!!

註:這篇是從 Yahoo Blog 搬過來的,原發文時間為 2006/12/26 14:35。


沒有留言: