这是我遇到的最奇怪的事情之一。我的问题是:
首先,我在Windows 7上使用Visual Studio 2015.在C ++ \ CLI项目中,我的代码类似于以下内容:
void Class::function(int flag)
{
if ((flag & CONST) != 0)
printf("Passed.");
else
printf("Failed.");
}
其中CONST
在另一个(非CLR)DLL中定义为0x111
。看起来很直截了当。我遇到的问题是当我进入flag
等于0x40
的程序时。对我来说,看起来这个程序应该打印Failed.
,而事实上它打印Passed.
。我做的下一件事是将我的代码改为:
void Class::function(int flag)
{
int local = CONST, localRes = flag & local, res;
if ((res = (flag & CONST)) != 0)
printf("Passed.");
else
printf("Failed.");
}
现在,打破printf
上的执行,我在Watch中获得了以下值:
res = 0x110
local = 0x111
localRes = 0x0
我无法看到CONST
的价值,尽管VS在这种情况下并不知道它。
就我而言,我可以使用local
来解决这个问题,但我宁愿理解它。有人可以告诉我编译/执行有什么问题吗?
谢谢!
编辑:在包含的头文件(包含为extern "C"
)中,定义如下:
#define CONST /
C1 | C2 | C3
经常出现C1
为0x1
,C2
为0x10
,C3
为0x100
。
答案 0 :(得分:0)
flag & CONST
扩展为flag & C1 | C2 | C3
,相当于(flag & C1) | C2 | C3
。
不要#define
没有括号的表达式,或者运算符优先级会咬你。
如果您无法控制标题,请将其包装在您自己的宏中:
#define GOOD_CONST (CONST)
或者将其放在变量中(如果需要在标题中公开,请使用extern
):
unsigned int GOOD_CONST = CONST;
仅在代码中使用它。