我已经分叉了一个 C++ 项目并在 switch 中添加了一些案例。然后它跳到下一个案例的中间。条件是 a int
,案例值是#define
d。由于代码很大,我在这里写了一些等效且简单的东西:
#define AAA 1
#define BBB 2
int X::func(int i) {
bool b = (i == 5);
int v = (b ? 10 : 5);
switch (i) {
case AAA:
if (b && v > 4) {
v = v + 1;
return 0;
}
break;
case BBB:
if (!b || v > 40) {
v = v + 2;
b = false; // direct jump here from the switch for i = AAA
return 0;
}
break;
}
return -1;
}
如果我将 AAA 传递给 X::func,代码执行会直接从BBB 案例内部跳转switch
到内部。b = false;
在真实的代码中,我有几十个案例,而且它发生在中间。如果我完全评论case BBB
,它会在评论中跳到同一个地方!每个案例都以 a 结尾,break;
并且内部没有变量声明。就像这里的变量 b 和 v 一样,它们是在 switch 语句之前声明的。
部分案例在一个#ifdef
#endif
区块中。出现问题的其他情况在此块中。条件为真,因此编译该块。不管怎样,我在抑制了这两个预编译器语句后测试了它,它是相同的。
如果我添加括号{}
以完全包含这里的情况,我仍然有相同的结果:
case BBB: {
if (!b || v > 40) {
v = v + 2;
b = false; // direct jump here from the switch for i = AAA
return 0;
}
break;
}
无论是在调试会话中还是在正常执行中,一切都可以正常编译并执行相同的操作。我在 Eclipse CDT Indigo 下使用 gcc 4.5.4。
它看起来像一个编译器错误,但可能是什么原因?