goto语句引起的crosses initialization of XXX

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

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

时间: 2024-10-07 11:01:51

goto语句引起的crosses initialization of XXX的相关文章

error: crosses initialization of

转载 http://hi.baidu.com/hins_pan/item/61ff3d8b2e072e52e63d1950感谢原作者 O(∩_∩)O~ 写代码时遇到同样问题,我的代码就不贴了 类似代码:int main(){ int a =0; switch(a) { case 0: int b = 0;break; case 1: break; default:break; } return 0;} 编译器提示错误:testswitch.cpp: In function 'int main()

error: jump to case label与crosses initialization of&quot;xx&quot;编译错误

前言 我过去使用vs下的cl编译程序时,从没遇到过此类错误,今天在Qt 5.3的MINGW版本下编译程序时,却出现 error: jump to case label与crosses initialization of"xx"编译错误. 解决方案 在switch语句的内部(包括case语句的内部)都不能声明变量,如需要声明,请在switch语句外面.

initialization of &#39;XXX&#39; is skipped by &#39;case&#39; label 原因及解决办法

今天遇到这个问题,在网上看了一会资料后找到原因,即: switch 的 case 中不能定义变量,不然就会报错.可能是变量的初始化会因为有时候case条件不被执行而跳过. 后来想到三个解决的方法: 1:用if else 代替 switch 语句; 2:在case中用{}将代码括起来,这样在{}中就能定义变量了; 3:如果变量在各个case中都要用的话,就把变量定义在switch外面吧; initialization of 'XXX' is skipped by 'case' label 原因及解

goto语句

goto语句的使用: #include <iostream> using namespace std; int main() { int i = 1; number: i++; std::cout<<"*"; if(i<10) { goto number; } std::cout<<"\n 程序结束"<<endl; return 0; } 输出: ********* 程序结束 一般不用goto语句,调试困难!因为

编程题:用goto语句实现,求1+2+...+100的结果。

#include<stdio.h> void main() { int n=1,s=0; loop:if(n<=100) { s=s+n; n=n+1; goto loop; } printf("1+2+3+...+100=%d\n",s); } goto语句介绍: 运行结果: 总结:goto语句为无条件转移语句.一般不推荐使用. 编程题:用goto语句实现,求1+2+...+100的结果.,布布扣,bubuko.com

C语言禁术——goto语句

goto语句是一种无条件转移语句,goto 语句的使用格式为:     goto  语句标号;其中标号是一个有效的标识符,这个标识符加上一个":"(冒号)一起出现在函数内某处,执行goto语句后,程序将跳转到该标号处并执行其后的语句. 另外标号必须与goto语句同处于一个函数中,但可以不在一个循环层中.通常goto语句与if条件语句连用,当满足某一条件时,程序跳到标号处运行. goto语句通常不用,主要因为它将使程序层次不清,且不易读,但在多层嵌套退出时,用goto语句则比较合理. 大

通过goto语句学习if...else、switch语句并简单优化

goto语句在C语言中实现的就是无条件跳转,第二章一上来就介绍goto语句就是要通过goto语句来更加清楚直观的了解控制结构. 我理解的goto语句其实跟switch语句有相似之处,都是进行跳转.不同的是goto语句是进行无条件的跳转,执行到这一句的时候直接就跳转了,而switch语句是要进行一个判断之后才能进行跳转.例如: 下面是用switch语句写的一个程序 1 #include <stdio.h> 2 int main(void) 3 { 4 char score; 5 scanf(&q

原来java中也有类似goto语句的标签啊--java label标签

http://blog.sina.com.cn/s/blog_6d5354cd0100xjg7.html —————————————————————————————————————————————————————————————— goto语句的危害: goto语句是在源码级上的跳转,这使其招致了不好的声誉.若一个程序总是从一个地方跳到另一个地方,还有什么办法来控制程序的流程. java中的“goto”: 虽然Java中goto语句只是java的一个保留字,没有起任何作用,但是我今天在使用con

c语言中的goto语句

goto 语句标号;实现无条件跳转 限制:goto和语句标号必须在同一个函数中,可以不在同一个循环层中. #include <stdio.h> int main(void){     int i,sum=0;     i=1; loop:if(i<=100){          sum+=i;          i++;          goto loop;      }      printf("sum=%d\n",sum);     return 0; } 结果