C++ プロジェクトをフォークし、いくつかのケースをスイッチに追加しました。そして、次のケースの途中でジャンプします。条件は anint
で、ケースの値は#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
toから直接ジャンプします。b = false;
実際のコードでは、数十のケースがあり、途中で発生します。まるっとコメントcase BBB
すると、コメントの同じところにジャンプ!すべてのケースは a で終わり、break;
内部に変数宣言はありません。ここで変数 b と v のように、それらは switch ステートメントの前に宣言されます。
ケースの一部は#ifdef
#endif
ブロックになっています。問題が発生する追加のケースは、このブロックにあります。条件が true であるため、ブロックがコンパイルされます。いずれにせよ、これら 2 つのプリコンパイラ ステートメントを抑制した後でテストしましたが、結果は同じでした。
ここのように括弧を追加{}
してケースを完全に囲むと、同じ結果が得られます。
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 を使用しています。
コンパイラのバグのように見えますが、何が原因でしょうか?