zl程序教程

您现在的位置是:首页 >  其他

当前栏目

goto语句引起的crosses initialization of XXX详解编程语言

编程语言 详解 语句 of 引起 xxx initialization goto
2023-06-13 09:11:47 时间

1. 背景

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

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

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

2. 代码例子

例子1:

 1 #include iostream 

 2 class Test{ 

 3 public: 

 4 int a; 

 5 }; 

 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没有初始化。编译报错。

goto语句引起的crosses initialization of XXX详解编程语言

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

例子2:

 1 #include iostream 

 2 class Test{ 

 3 public: 

 4 Test(int _a):a(_a){}; //提供显示构造函数 

 5 int a; 

 6 }; 

 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详解编程语言

 

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/17508.html

cgojavamacphp