码迷,mamicode.com
首页 > 其他好文 > 详细

goto语句引起的crosses initialization of XXX

时间:2018-06-14 11:36:24      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:vrp   ssg   zfs   spn   dtc   程序   xtu   sof   card   

1. 背景

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

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

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

2. 代码例子

例子1:

 1 #include <iostream>
 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;  //2
13 _Lab1:
14     std::cout << t2->a << std::endl;    //1 
15     //std::cout << t2.a << std::endl;   //2
16     return 0;
17 }

从代码中也可以看出来,

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

技术分享图片

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

例子2:

 1 #include <iostream>
 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语句导致未初始化,编译失败。

 技术分享图片

 

goto语句引起的crosses initialization of XXX

标签:vrp   ssg   zfs   spn   dtc   程序   xtu   sof   card   

原文地址:https://www.cnblogs.com/xudong-bupt/p/9175963.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!