现在的位置: 首页 > 综合 > 正文

crosses initialization of “XXX”

2013年08月16日 ⁄ 综合 ⁄ 共 926字 ⁄ 字号 评论关闭

crosses initialization of “XXX”

goto
crosses
initialization
of
“xxx”
it
    分类: 编程
这个问题是由于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++ code
    goto end; int x = 111; end: ; cout<<x<<endl;

抱歉!评论已关闭.