c++ error:crosses initialization of 问题解决
创始人
2025-05-31 15:34:29

最近在写代码的时候,碰到了 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 << "goto the label" << std::endl;
}

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

2.2 问题的解决

2.2.1 限定 myNum 的作用域

void gotoTest() {goto label;{int myNum = 1;}label: std::cout << "goto the label" << std::endl;
}

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

2.2.2 确保 myNun 被初始化

void gotoTest() {int myNum = 1;goto label;label: std::cout << "goto the label" << std::endl;
}

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

结论

crosses initialization of 翻译过来就是 跳过了初始化,根本原因是变量在其作用范围内,存在不被初始化的风险,解决思路有两个:一是明确限定变量的作用域;而是将初始化提前,避免不被初始化的发生。

相关内容

热门资讯

12月18日晚间重要公告集锦 精工钢构:公司拟向控股子公司增资1.5亿元;江南新材:拟3亿元投建高端铜基核心材料研发及产业化项目;...
胜通能源连续6日涨停 股价续创... 胜通能源(001331)19日再度涨停,续创历史新高。至此,该股已连续6个交易日涨停。 公司17日晚...
ICT趋势年会 | 长飞郑昕:... 2025年12月17日,由工信智媒体(通信世界)举办的“2026 ICT行业趋势年会”在北京举办。会...
袁小饺获“年度先锋品牌”,以创... 近日,在美团第八届餐饮产业大会上,袁小饺凭借在产品创新、数字化运营及产业赋能等领域的突出表现,斩获“...
原创 铁... 哈喽大家好,今天老张带大家聊聊最近全球铁矿圈接连爆出两个大瓜,剧情反转比短视频里的狗血剧还刺激,主打...