Ryukalice

E2126 case でローカル変数の初期化がとばされた

2013-12-07

以下のように、switch 文の case 内でローカル変数を宣言すると、

E2126 case でローカル変数の初期化がとばされた

というエラーが発生します。

switch (value) {
    case 0:
        int i = 10;    // エラー
        routine(i);
        break;

    case 1:
        break;

    default:
        break;
}

Embarcaderoのリファレンスには、このエラーについて以下のように書いてあります。

C++では,ローカル変数の初期化を省略することは不正です。このエラーは,case ラベルにより,ローカル変数を素通りして制御が進む可能性があることを示します。 引用元: E2126 case でローカル変数の初期化がとばされた (C++) - RAD Studio XE3

ちょっと分かりにくいのですが、case 内でのローカル変数のスコープは、別の case 内にも及ぶので怒られるのではないかと勝手に理解しています。何故なら、C++ のローカル変数のスコープは、そのブロック内、つまり {} の中であるためです。上記の例で言えば、switch 文全体の {} になります。

解釈が合っているのかは分かりませんが、解決策としては、そのローカル変数のスコープを明確にしてやるということです。

switch (value) {
    case 0:
        // 意図的にブロックを作る。
        {
            int i = 10;    // iのスコープはここから
            routine(i);
            break;
        }   // iのスコープはここまで

    case 1:
        break;

    default:
        break;
}

if, for 等の制御構文の始まり以外の場所でも、明示的なブロックを作る貴重な機会です。