在这里,我们有一组C宏,用于使用预处理器执行位域操作,并且在Visual Studio中尝试使用这些宏时会遇到警告。这个问题可以很容易地证明:位域掩码计算宏
#define BITFIELD_WIDTHMASK(Width) \
((Width) >= 32 ? ~0x0ul : (1ul << (Width)) - 1)
unsigned long foo(void)
{
return BITFIELD_WIDTHMASK(32);
}
与MSVC编译此产生了警告:
test.c(12) : warning C4293: '<<' : shift count negative or too big, undefined behavior
这是不是一个行为问题 - <<
运营商将不会在这种情况下使用,这应该在编译时检测到。但是,有没有人有任何关于如何重写宏以避免警告的建议?或者,如果失败了,如何为此重新设计宏接口?
预先感谢
工作,并且干净而紧密。到底是什么我以后。谢谢! – 2010-05-04 22:37:28
当宽度是常数时,这是有效的。但是,如果它是一个变量,那么它的运行效率可能会低于一个班次,如果这很重要的话。仍然;涵盖了所有的基础。 +1。 – Clifford 2010-05-04 22:48:54