crosses initialization of “XXX”
2015-07-28 17:58
218 查看
http://blog.sina.com.cn/s/blog_4b9eab320100s8s1.html
crosses initialization of “XXX”
这个问题是由于goto引起的;goto是已经名为不提倡的语句,但是有时它还是很有用的。代码:
11 void func()
12 {
13 A a1;
14 cout << "hello,world!" << endl;
15 goto end;
16 A a2;
17 end:
18 return;
19 }
不能通过编译:
$ g++ declare.cpp
declare.cpp: In function ‘void func()’:
declare.cpp:17: error: jump to label ‘end’
declare.cpp:15: error: from here
declare.cpp:16: error: crosses initialization of ‘A a2’
gcc要求变量的定义不能位于goto之后;这个可能和编译器对栈变量的处理有关,一个网友的解释感觉比较说到点子:
不知道怎么说能帮你理解。先这么说吧,你的编译器最中规中矩的做法(不涉及一些优化)是会为每条语句生成目标代码,实际执行的时候goto可能会越过一些已经生成的目标代码的执行。
所以你的结果取决于编译器能不能检测到越过int x了 因为int x是要在编译时就要确定x的定义,但是goto语句运行时才会实际被执行到,好比运行时到goto的地方我直接跳过了这条下面的语句,然而这条语句偏偏是定义语句,实际在编译时已经被编译了(因为你用的编译器在编译时并不检查goto的跳转,照样为越过的语句生成目标代码,但很很巧目标代码是初始化语句,可能会在进入函数时就为函数内部的局部变量“自动”分配栈空间的的操作),但是作为一个编译器是不是应该在编译阶段检查到这种编译阶段对定义初始化语句的越过就是各持己见的事情了。
你试下下面代码在你的编译器上应该输出随即数,因为x空间分配了,但是x=111;的初始化并没执行。
C/C++
[u]code [/u]
相关文章推荐
- 牵扯较多属性和方法的类题目,很简单的题目本来不想发的,如果有同学学到这个题目感觉太长不愿敲代码,copy走我的即可~不过还是建议自己打一打
- javascript 特殊的面向对象以及继承详解(入门篇)
- 牵扯较多属性和方法的类题目,很简单的题目本来不想发的,如果有同学学到这个题目感觉太长不愿敲代码,copy走我的即可~不过还是建议自己打一打
- 【MongoDB】开启认证权限
- hdoj- Windows Message Queue
- netty开发一个程序。
- BZOJ 1588([HNOI2002]营业额统计-set)
- 记录我这两天工作的点滴
- NoSQL是什么?
- JVM基础概念总结:数据类型、堆与栈
- android java.nio.bufferoverflowexception
- 多校第三场 1001 hdu 5316 Magician( 区间合并线段树)
- 招聘网站上可以收集很多信息——very good
- hdoj- Windows Message Queue
- mysql之mysql数据在磁盘的储存方式
- 有关照片多选及展示这一块(类似微信朋友圈)
- 使用Handler更新图片,结合了HttpCliet 和ProgressDialog
- cocos2d-x 精灵换图片
- Gradle插件用户指南(译)
- linux添加开机自启动脚本示例详解