【发布时间】:2013-09-15 02:20:09
【问题描述】:
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 关键字,这意味着它实际上并未分配。编译的很好,很奇怪!
【问题讨论】:
-
我认为变量是分配的,它根本没有初始化,这是完全不同的。虽然由于您使用的是类对象,但默认构造函数可能会运行。
-
@ChrisHayes 这怎么可能?你的意思是说extern关键字'可以'分配一个变量吗?
-
@rici 我看不到任何迹象表明
B::x在不同的 CU 中。实际上,这段代码编译的唯一原因似乎是因为它都在一个 CU 中。 -
@rici 它在同一个编译单元中。此外,我通过 z.f() 访问了 B::x。
-
@syam 你的意思是,如果在同一个编译单元中,没有找到声明,extern 关键字可以省略吗?