2014-11-06 53 views
2

类的静态成员被编译为类作用域的全局变量。编译的const静态成员和静态constexpr成员如何? 编译器是否为每个.o文件创建了此静态成员的副本,否则它就完成了吗?静态const成员是否有内部联动?

+0

常规静态const成员有外部链接。 – 2014-11-06 11:09:28

+0

如果我在类声明(.h文件)中放置了一些静态常量成员的定义,为什么链接器不提供有关双重定义(如果是外部链接)的警告? – 2014-11-07 10:17:32

+0

因为整数有一个特例。除非你在课堂外给他们定义,否则他们没有联系。 – 2014-11-07 10:55:28

回答

3

这是通过C++ 14 [class.static.data]/5覆盖:

Static在命名空间范围的一类的数据成员具有外部连接。本地类不得有静态数据成员。

“名称空间范围内的类”表示不在块范围内的类(又名“本地类”)。例如,此代码:

void func() 
{ 
    class C { static const int x = 5; }; 
} 

不合格。


要回答你的问题:

编译器是否为每个.o文件将使得这一静态成员的副本,或者它以其他方式呢?

通常情况下,如果静态成员在类的外部有一个定义,那么它将有一个副本,在与该定义的位置相对应的目标文件中,否则将不存在。

相关问题