crosses initialization of “XXX”
2011-08-02 10:14
134 查看
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;
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;
相关文章推荐
- 关于crosses initialization of “XXX的问题
- error: jump to case label \n error: crosses initialization of xxx
- 关于Symbian的"crosses initialization of XXX"错误
- crosses initialization of “XXX”
- gcc error: crosses initialization of XXX
- error: jump to case label error: crosses initialization of xxx
- crosses initialization of “XXX” 的问题
- switch 语句:error : crosses initialization of 'xxx' and jump to case label [-fpermissive]
- gcc/g++ error: crosses initialization of
- error:crosses initialization of ...的解决办法
- error:jump to case label error:crosses initialization of
- 解决问题crosses initialization of char
- org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role:XXX
- 两次碰到编译错误: crosses initialization of...
- 编译错误: crosses initialization of...
- initialization of 'XXX' is skipped by 'case' label 原因及解决办法
- initialization of xxx is skipped by xxx
- initialization of xxx is skipped by xxx
- error: jump to case label,crosses initialization of "xxxxxx"
- error:crosses initialization of ...的解决办法