gpt4 book ai didi

c++ - "crosses initialization of variable"仅当初始化结合声明时

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:20:03 24 4
gpt4 key购买 nike

我读过 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循环,那么每次进入和离开那个作用域时,是不是都会调用构造函数和析构函数,导致效率下降?或者编译器会优化它吗?

最佳答案

跳过对象的初始化,即使对象的类型是 int , 始终是未定义的行为。请注意,switch -statement 的声明没有什么特别的:它只是一个声明,人们已经[滥用]使用了这种有趣的方式,例如,Duff's Device。 .声明中唯一特别的是标签可以采用 default: 的形式。和 case <const-integer-expr>: .

声明int i;是变量的定义但没有初始化。因此,没有绕过变量的初始化。没有比一开始就跳过这个定义更大的问题了。当然,值是在跳转到 case 1: 时分配的。而不是在跳转到 case 2: 时但这与 switch 之外的代码中发生的情况没有什么不同-如果人们只定义变量的语句。

关于c++ - "crosses initialization of variable"仅当初始化结合声明时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12992108/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com