2

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 关键字,这意味着它实际上并未分配。它编译得很好很奇怪!

4

1 回答 1

6

没有成员变量的extern声明之类的东西!static无论如何,该变量是extern根据类的定义声明的。gcc 警告您不能将static成员变量显式声明为extern. 但是,gcc 和 clang 都毫不费力地编译和链接代码,显然忽略了extern.

当然,使用上面的代码也很清楚,您首先使用一些非标准模式进行编译,因为它main()依赖于int从未包含在 C++ 中的隐式规则。

于 2013-09-15T02:56:37.297 回答