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
等の制御構文の始まり以外の場所でも、明示的なブロックを作る貴重な機会です。