博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
goto语句引起的crosses initialization of XXX
阅读量:6246 次
发布时间:2019-06-22

本文共 1017 字,大约阅读时间需要 3 分钟。

1. 背景

goto语句虽然目前已经不提倡使用,但是用起来还是很方便,尤其是老代码中见的比较多。

在改动有goto语句的老代码时需要特别注意,是否跳过来资源的释放、有用变量的初始化等等

很久之前写c程序时,有些提交系统要求变量必须在函数开始地方全部申明,最近遇到了"crosses initialization of XXX"知道为什么了。就是因为有可能跳过变量的声明。

2. 代码例子

例子1:

1 #include 
2 class Test{ 3 public: 4 int a; 5 }; 6 7 int main(){ 8 Test t1; 9 std::cout << "ok" << std::endl;10 goto _Lab1; 11 Test *t2 = new Test; //1 12 //Test t2; //213 _Lab1:14 std::cout << t2->a << std::endl; //1 15 //std::cout << t2.a << std::endl; //216 return 0;17 }

从代码中也可以看出来,

(1) 在只打开第一种情况下,“goto _Lab1”跳过来t2变量的定义,导致t2没有初始化。编译报错。

(2) 在只打开第二种情况下,由于Test类没有显示构造函数,编译器会提供无参数的默认构造函数。编译正常。执行后t2.a 是随机的int值。

例子2:

1 #include 
2 class Test{ 3 public: 4 Test(int _a):a(_a){}; //提供显示构造函数 5 int a; 6 }; 7 8 int main(){ 9 Test t1(1);10 std::cout << "ok" << std::endl;11 goto _Lab1; 12 Test t2(3); //没有执行初始化13 _Lab1:14 std::cout << t2.a << std::endl;15 return 0;16 }

Test类显示提供了带参数构造函数后,t2由于goto语句导致未初始化,编译失败。

 

 

转载地址:http://kmoia.baihongyu.com/

你可能感兴趣的文章
ftp passive mode
查看>>
安装问题Error: dl failure on line 864
查看>>
oracle表分区详解(按天、按月、按年等)
查看>>
yum update upgrade区别
查看>>
angularjs select 三级联动
查看>>
BufferedReader指定编码及乱码问题解决
查看>>
Zabbix3.0监控Centos 6配置
查看>>
解决MAC下svn run cleanup interrupted错误
查看>>
谈谈Android中的Divider
查看>>
Python基础笔记
查看>>
对Vsftpd的一些总结
查看>>
搭建高可用mongodb集群(二)—— 副本集
查看>>
001-Python运算符
查看>>
saltstack使用之二(完成部署编译nginx以及部分cp模块的使用)
查看>>
Test20160120
查看>>
Android WindowManager$BadTokenException异常
查看>>
ELK学习3 启动es常见错误或问题
查看>>
Linux快捷键和帮助
查看>>
2015年10月22日作业
查看>>
tr命令练习
查看>>