「ケース ラベルにジャンプ」エラーに関するこの質問を読みましたが、まだいくつか質問があります。Ubuntu 12.04 で g++ 4.7 を使用しています。
このコードはエラーを返します:
int main() {
int foo = 1;
switch(foo) {
case 1:
int i = 0;
i++;
break;
case 2:
i++;
break;
}
}
エラーは
jump-to-case-label.cpp: In function ‘int main()’:
jump-to-case-label.cpp:8:8: error: jump to case label [-fpermissive]
jump-to-case-label.cpp:5:9: error: crosses initialization of ‘int i’
ただし、このコードは正常にコンパイルされ、
int main() {
int foo = 1;
switch(foo) {
case 1:
int i;
i = 0;
i++;
break;
case 2:
i++;
break;
}
}
2 番目のコードは最初のコードよりも危険性が低いですか? なぜg ++がそれを許可するのか混乱しています。
次に、この問題の修正は、初期化された変数のスコープを設定することです。初期化された変数が大きなオブジェクトで、switch文がwhileループになっていると、そのスコープに出入りするたびにコンストラクタとデストラクタが呼び出されて効率が低下するのではないか? または、コンパイラはこれを最適化しますか?