1. ホーム
  2. c++

[解決済み] switch文の中で変数を宣言してはいけないのはなぜですか?

2022-03-18 16:26:04

質問

いつも不思議に思うのですが、なぜswitch文のcaseラベルの後に変数を宣言してはいけないのでしょうか? C++では、変数はほとんどどこでも宣言できますが(最初に使う場所の近くで宣言するのは明らかに良いことです)、次のようにするとまだうまくいきません。

switch (val)  
{  
case VAL:  
  // This won't work
  int newVal = 42;  
  break;
case ANOTHER_VAL:  
  ...
  break;
}  

上記では、以下のようなエラーになります(MSC)。

newVal' の初期化は 'case' ラベルでスキップされます。

これは他の言語でも制限されているようです。 なぜこのような問題があるのでしょうか?

解決するには?

Case ステートメントは ラベル . つまり、コンパイラはこれをラベルに直接ジャンプしていると解釈します。C++の場合、ここで問題になるのはスコープの問題である。中括弧がスコープを定義しており、その範囲は switch ステートメントを使用します。つまり、初期化をスキップして、さらにコードの中にジャンプが実行されるようなスコープが残っていることになります。

これを処理する正しい方法は、そのスコープに特化して定義することです。 case 文の中で変数を定義してください。

switch (val)
{   
case VAL:  
{
  // This will work
  int newVal = 42;  
  break;
}
case ANOTHER_VAL:  
...
break;
}