VS2010下C ++中的定义问题

时间:2011-02-13 09:04:31

标签: c++

正在研究一些代码,并认为尝试实现一些快速的解决方法定义函数会有点聪明。然而当我决定将MostSigBit函数放在一个定义中并突然构建我的项目开始失败时,一切都变得沮丧。

甚至使用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

2 个答案:

答案 0 :(得分: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)

考虑使用内联函数,因为Frederic写的宏是邪恶的:

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; }

答案 1 :(得分: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)