2011-02-13 28 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; }