c++ error:crosses initialization of问题怎么解决

免费教程   2024年05月10日 15:46  

今天小编给大家分享一下c++:crossesinitializationof问题怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

情形1 在 switch case 的某个分支定义了变量1.1 问题代码示例#include<iostream>voidswitchTest(intcode);intmain(){switchTest(1);}voidswitchTest(intcode){switch(code){case1:intmyNum=0;break;case2:break;default:break;}}

上述代码,我在第一个 case 分支下定义了 myNum 变量,尝试编译,出现如下错误。主要看 C2360 这一行,myNum 的初始化操作由 case标签跳过,也就是说当 code !=1 的时候,不会进行 myNum 的初始化。第一反应是“我这个 myNum 只在 case 1 下用啊,不初始化就不初始化嘛,反正其他地方又不用”。

呃,这就牵扯到变量的作用范围了。myNum 这个局部变量的作用范围是从定义处开始直到 switch 语句结束。通俗说,就算我们跳过了 case 1 处的初始化,myNum 在后面的分支中,也是可以被访问到的,被访问到就有可能被使用(虽然我们自己没打算在后面使用,但编译器认为这是有风险的),但是我们又没有对其进行初始化,那这就会出问题。那这个问题怎么处理呢?

1.2 问题的解决1.2.1 限定 myNum 的作用域voidswitchTest(intcode){switch(code){case1:{intmyNum=0;break;}case2:break;default:break;}}

我们给 case 1 加上大括号,明确告诉编译器,我们在后面不使用这个 myNum 了,它只在 case 1 里有效,这种方式应该是最符合我们本意的。

1.2.2 确保 myNun 被初始化voidswitchTest(intcode){intmyNum=0;switch(code){case1:break;case2:break;default:break;}}

既然 myNum 不被初始化的原因的是 case 分支,那么我们将 myNum 的初始化提到 switch 外面吧,这样一来,在它的作用域内,myNum 就肯定会被初始化了。

1.2.3 不算方案的方案voidswitchTest(intcode){switch(code){case2:break;case1:intmyNum=0;break;}}

上面这种写法是能编译过的,而且满足我的意图。我把 case 1 放到了最后一个分支,这样一来,myNum 的作用域就只是在最后一个分支了,在 myNum 的作用域内,它都是被初始化了的,因此是不会出问题的。当然,这样写只是为了说明,出现这个错误的根因是:变量在其作用范围内,可能不会被初始化。(项目中请勿这样弄哦)

情形2 goto 跳过了变量的初始化2.1 goto 中的错误示例#include<iostream>voidgotoTest();intmain(){gotoTest();}voidgotoTest(){gotolabel;intmyNum=1;label:std::cout<<"gotothelabel"<<std::endl;}

上面的代码里,我们使用 goto 跳过了 myNum 的初始化,不出意外的出了意外,编译时出现如下错误,原因和我们上面 switch 的例子是一样的,那解决方法自热也是类似的

2.2 问题的解决2.2.1 限定 myNum 的作用域voidgotoTest(){gotolabel;{intmyNum=1;}label:std::cout<<"gotothelabel"<<std::endl;}

限制 myNum 的作用域,告诉编译器我们在后面不使用了。

2.2.2 确保 myNun 被初始化voidgotoTest(){intmyNum=1;gotolabel;label:std::cout<<"gotothelabel"<<std::endl;}

将 myNum 的初始化提前,确保不会因为 goto 导致跳过了初始化。

以上就是“c++error:crossesinitializationof问题怎么解决”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注行业资讯频道。

域名注册
购买VPS主机

您或许对下面这些文章有兴趣:                    本月吐槽辛苦排行榜

看贴要回贴有N种理由!看帖不回贴的后果你懂得的!


评论内容 (*必填):
(Ctrl + Enter提交)   

部落快速搜索栏

各类专题梳理

网站导航栏

X
返回顶部