私はいつも疑問に思っていました。なぜ switch ステートメントの case ラベルの後に変数を宣言できないのでしょうか? C++ では、変数をほぼどこでも宣言できます (そして、最初に使用する場所の近くに宣言するのは明らかに良いことです) が、次のコードはまだ機能しません。
switch (val)
{
case VAL:
// This won't work
int newVal = 42;
break;
case ANOTHER_VAL:
...
break;
}
上記の場合、次のエラーが発生します (MSC):
'newVal' の初期化は 'case' ラベルによってスキップされます
これは他の言語でも制限事項のようです。なぜこれが問題になるのでしょうか?
ベストアンサー1
Case
ステートメントはラベルのみです。つまり、コンパイラはこれをラベルへの直接ジャンプとして解釈します。C++ では、ここでの問題はスコープの 1 つです。中括弧は、ステートメント内のすべてのものをスコープとして定義しますswitch
。つまり、初期化をスキップしてコードのさらに奥にジャンプするスコープが残されます。
これを処理する正しい方法は、そのcase
ステートメントに固有のスコープを定義し、その中で変数を定義することです。
switch (val)
{
case VAL:
{
// This will work
int newVal = 42;
break;
}
case ANOTHER_VAL:
...
break;
}