這兩天在拆 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。
沒有留言:
張貼留言