2007年7月12日 星期四

為何不要用 #define

這兩天在拆 header file dependency 時(本公司的 coupling 情況很嚴重),碰到一個 compile error:

error C2632: 'char' followed by 'char' is illegal


點進去看後,那行 code 是在 windows 6.0 SDK (Vista SDK)的 intsafe.h, 內容是:

typedef unsigned char BYTE;

照理說 BYTE 不管原來有沒有被定成別的型別,都不該導至這行出錯,因為typedef 只是個別名,被改來改去是無所謂的。按照 error message 的說法,compiler 是把這行當成

typedef unsigned char char;

來處理了,但為什麼會這樣呢? 經過 N 層的 #include header file 後(真的很多層,真難找),終於找到兇手是:

#define BYTE unsigned char

因為 macro ( #define )是在還沒進 compiler 前就以 preprocessor 處理掉的,它只是做當純的取代動作,就像是 copy/paste 那樣,它並不知道 C++ 的語言機制(typedef),所以

typedef unsigned char BYTE;

就被取代為

typedef unsigned char unsigned char;

當然出錯! 大家記得盡量別用 #define 啊!

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


沒有留言: