才剛寫完一篇為何不要用 #define 的實例,立刻又碰上另外一個。先來看個 example:
#include <windows.h>int MyMax = std::numeric_limits ::max( );一切看來很正常,compile 起來也很正常。但當你加入一行 #include
#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。
沒有留言:
張貼留言