c++ error:crosses initialization of 问题解决 您所在的位置:网站首页 故障代码c-2253 c++ error:crosses initialization of 问题解决

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

2023-04-01 01:15| 来源: 网络整理| 查看: 265

最近在写代码的时候,碰到了 crosses initialization of ... 的问题,只因我在 switch 的某个 case 分支下定义了一个变量,于是乎便将这个问题整理一下。

情形1 在 switch case 的某个分支定义了变量 1.1 问题代码示例 #include void switchTest(int code); int main() { switchTest(1); } void switchTest(int code) { switch (code) { case 1: int myNum = 0; break; case 2: 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 的作用域 void switchTest(int code) { switch (code) { case 1: { int myNum = 0; break; } case 2: break; default: break; } }

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

1.2.2 确保 myNun 被初始化 void switchTest(int code) { int myNum = 0; switch (code) { case 1: break; case 2: break; default: break; } }

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

1.2.3 不算方案的方案 void switchTest(int code) { switch (code) { case 2: break; case 1: int myNum = 0; break; } }

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

情形2 goto 跳过了变量的初始化 2.1 goto 中的错误示例 #include void gotoTest(); int main() { gotoTest(); } void gotoTest() { goto label; int myNum = 1; label: std::cout int myNum = 1; } label: std::cout


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有