温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2023-03-21 15:45:07 来源:亿速云 阅读:86 作者:iii 栏目:开发技术

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

情形1 在 switch case 的某个分支定义了变量

1.1 问题代码示例

#include <iostream>

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 下用啊,不初始化就不初始化嘛,反正其他地方又不用”。

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

呃,这就牵扯到变量的作用范围了。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 <iostream>

void gotoTest();

int main()
{
	gotoTest();
}

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

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

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

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 导致跳过了初始化。

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

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c++
AI