C++ プロジェクトをフォークし、いくつかのケースをスイッチに追加しました。そして、次のケースの途中でジャンプします。条件は anintで、ケースの値は#defined です。コードが大きいので、同等で単純なものをここに書きます。
#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 ケース内のswitchtoから直接ジャンプします。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 を使用しています。
コンパイラのバグのように見えますが、何が原因でしょうか?