为什么编译和链接此代码没有错误?

时间:2013-09-15 02:20:09

标签: c++ g++

extern关键字不应该简单地“盲目”编译器吗?以下是我无法理解为什么没有错误的代码。

struct A {
    int a;
};

class B {
    static A x;
public:
    void f() { x.a=0; }
};

extern A B::x; // not allocated.

main() {
    B z;
    z.f();
}

如您所知,静态成员应该手动实例化。但是,我添加了extern关键字,这意味着它实际上没有被分配。编译很好很奇怪!

1 个答案:

答案 0 :(得分:6)

extern成员变量没有static声明!无论如何,根据类的定义声明变量extern。 gcc警告您不能将static成员变量显式声明为extern。但是,gcc和clang都会编译并链接代码而不会更加轻视,显然忽略了extern

当然,使用上面的代码,很明显你首先使用某些非标准模式进行编译,因为main()依赖于隐式int规则,而该规则从未成为C ++的一部分