隐性说明
Goto can't skip over definitions of variables, because those variables would not exist after the jump, since lifetime of variable starts at the point of definition. The specification does not seem to explicitly mention goto must not do that, but it is implied in what is said about variable lifetime.
-fpermissive标记
参考[4]中提到,g++编译器默认是检查的,自己可以设置编译器的这个标记变成警告,未实践!!!
查了下资料-fpermissive标记的作用是: 把代码的语法错误作为警告,并继续编译进程,所以就安全起见,这个角度就不要想了,还是老老实实码砖!
POD类型
参考[3],按照上面C++规定的说法,只要是POD类型,并且没有初始化都是可以编译通过的。
看一段代码:
#include <iostream>
using namespace std;
class A{
public:
// 注意:和B不同的是有构造和析构函数, 所以编译报错
A(){}
~A(){}
void testA(){
cout << "A::test." << endl;
}
};
class B{
public:
void testB(){
cout << "B::test." << endl;
}
};
int main()
{
goto Exit;
// int a = 1; // windows ok.linux failed!
//A classA; // failed:
B classB; // success:
classB.testB();
Exit:
classB.testB();
return 0;
}
结果:
[root@localhost c-c++]# g++ goto_study.cpp
[root@localhost c-c++]# ./a.out
a = 1259648
B::test.
小结:
1、以上代码在windows和linux下均编译通过和执行;
2、A classA一句在windows和linux均编译不通过!因为A有构造和析构函数,不满足条件;
3、至于int a = 1;这样的写法在windows(msvc)下面能够通过就与C++规范不符了,求解释!!!
以下是POD类型(还是看英文吧):
1、int, char, wchar_t, bool, float, double是POD类型,这些类型的long/short and signed/unsigned版本也是;
2、 指针(包括函数指针和成员指针)都是POD类型;
3、enums枚举类型;
4、POD的const和普通变量也都是;
5、POD类型的class,struct和union也是。但要求所有的成员是public,并且没有基类,没有构造、析构函数和虚函数。静态成员在这些规则下也是。
总结
1、最好不要用goto;
2、goto后面不要跳过定义和初始化的变量,如果是POD类型可以先申明再定义,是不会编译报错的。但是不建议这么使用,可以看到如果执行语句跳过了赋值语句,那么变量的值是未知的,存在危险性;










