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人に達しました。感激しております。ありがとうございます。これからも、"涼の成長記録"を、どうぞ宜しくお願い致します。
ではでは。