我已经阅读了这个关于“跳转到案例标签”错误的问题,但我仍然有一些问题。我在 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;
}
}
第二个代码比第一个代码危险吗?我对为什么 g++ 允许它感到困惑。
其次,解决这个问题的方法是限定初始化变量的范围。如果初始化的变量是一个大对象,并且switch语句在while循环中,会不会每次进入和离开那个scope都会调用构造函数和析构函数,导致效率下降?或者编译器会优化这个吗?