【问题标题】:Bitwise operation with constant issue具有恒定问题的按位运算
【发布时间】:2024-01-30 09:10:02
【问题描述】:

这是我遇到的最奇怪的事情之一。我的问题是这样的:

首先,我在 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

C10x1C20x10C30x100

【问题讨论】:

  • CONST 是如何定义的?
  • 你试过将CONST定义为extern吗?
  • 也许这不是很清楚。特别是“在另一个非 CLR dll 中定义”的说法似乎不太可能,从 dll 导出数据并不是很明显。
  • 如果没有任何额外的信息,我希望@ThomasMatthews 有所收获。例如。如果 CONST 是一个定义不明确的宏,当您使用 flag & CONSTflag & (CONST) 时,您的行为可能会发生变化。
  • 我们有了它。案件结案。

标签: visual-studio c++-cli constants bitwise-operators


【解决方案1】:

flag & CONST 扩展为flag & C1 | C2 | C3,相当于(flag & C1) | C2 | C3

永远不要使用没有括号的 #define 表达式,否则运算符优先级会咬你。

如果您无法控制标头,请将其包装在您自己的宏中:

#define GOOD_CONST (CONST)

或将其放入变量中(如果需要在标头中公开,请使用extern):

unsigned int GOOD_CONST = CONST;

并且只在你的代码中使用它。

【讨论】:

  • 或:constexpr unsigned GOOD_CONST = CONST;