【发布时间】:2012-10-11 02:55:59
【问题描述】:
我已阅读 this question 关于“跳转到案例标签”错误的信息,但我仍有一些问题。我在 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都会调用构造函数和析构函数,导致效率下降?或者编译器会优化它吗?
【问题讨论】:
-
我不明白为什么会编译。如果您直接进入案例 2,您的
i甚至还没有被声明! -
(“次要”错误消息似乎与问题更相关。)
-
投反对票的人能否解释一下他们的投反对票?
-
@alestanis:为什么你认为
i还没有被声明?它在case 1:标签之后的行中明确定义。break语句 不要 神奇地将块拆分为不同的范围。这样做没有任何意义,因为如果程序员选择这样做,它们可以有条件地执行。
标签: c++ performance g++ switch-statement