2011-02-13 56 views
0

一直在研究一些代碼,並認爲嘗試實現一些快速變通的定義函數會有點巧妙。然而,當我決定將MostSigBit函數放在一個單獨的定義中,並突然構建我的項目開始失敗時,所有事情都變得沮喪起來。VS2010中C++中的定義問題

即使使用if-else語句重寫了這段代碼,沒有運氣仍然會出現相同的結果!

#define MostSigBit(x) (x&0x80 == 0x80) (x = x<<1^0x1B) : (x <<= 1) 
#define MultiplyBy2(x) (x != 0) ? (MostSigBit(x)) : 0 
#define MultiplyBy3(x) (x != 0) ? (MostSigBit(x)^x) : 0 
+0

那麼,你是如何使用它?我們傾向於避免宏觀的原因,我們有模板。 (當然,用戶代碼中的聰明幾乎總是一件壞事。) – GManNickG 2011-02-13 09:05:55

回答

1

問號丟失:

#define MostSigBit(x) (x&0x80 == 0x80) (x = x<<1^0x1B) : (x <<= 1) 

應該是:

#define MostSigBit(x) (x&0x80 == 0x80) ? (x = x<<1^0x1B) : (x <<= 1) 
3

括號缺失,應該是:

#define MostSigBit(x) (((x) & 0x80 == 0x80) ? ((x) = ((x)<<1^0x1B)) : ((x) <<= 1)) 
#define MultiplyBy2(x) (((x) != 0) ? (MostSigBit(x)) : 0) 
#define MultiplyBy3(x) (((x) != 0) ? (MostSigBit(x)^(x)) : 0) 

考慮使用內聯函數是,弗雷德裏克寫的宏是evi l:

inline char MostSigBit(char x) { return (x & 0x80 == 0x80) ? (x<<1^0x1B) : (x << 1); } 
inline char MultiplyBy2(char x) { return x != 0 ? MostSigBit(x) : 0; } 
inline char MultiplyBy3(char x) { return x != 0 ? MostSigBit(x)^x : 0; }