涼の成長記録

自らの人生に主導権を持つべく、独立を目指して2014年3月31日を持ってITエンジニアを退職。そんな23歳♂の成長記録。

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

以下のように、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等の制御構文の始まり以外の場所でも、明示的なブロックを作ることができることを、知らない方は多いです。まあ、そんなに使う機会に恵まれることはありませんが。


あと、全然関係ないのですが、なんと読者が20人に達しました。感激しております。ありがとうございます。これからも、"涼の成長記録"を、どうぞ宜しくお願い致します。

ではでは。