【问题标题】:Does static const member have internal linkage?静态 const 成员是否有内部链接?
【发布时间】:2015-01-02 20:41:35
【问题描述】:

类的静态成员被编译为类范围的全局变量。如何编译 const 静态成员和静态 constexpr 成员? 每个 .o 文件的编译器是否会复制此静态成员或以其他方式完成?

【问题讨论】:

  • 常规静态 const 成员具有外部链接。
  • 如果我将一些静态 const 成员的定义放在类声明(.h 文件)中,为什么链接器不警告我双重定义(如果是外部链接)?
  • 因为整数有特殊情况。除非您将它们的定义放在类之外,否则它们没有联系。
  • @NeilKirk 他们在所有情况下都有外部联系。整数的特殊情况只是整数可以有一个类内初始化器。当且仅当变量是 odr-used 时才需要外部定义。

标签: c++ class static constants linkage


【解决方案1】:

C++14 [class.static.data]/5 涵盖了这一点:

Static 命名空间范围内类的数据成员具有外部链接。本地类不应有静态数据成员。

“命名空间范围内的类”是指不在块范围内的类(又名“本地类”)。例如这段代码:

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

格式不正确。


回答你的问题:

每个 .o 文件的编译器是复制这个静态成员还是以其他方式完成?

通常情况下,如果静态成员在类之外有定义,则在与该定义位置对应的目标文件中将有一份它的副本,否则将没有。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-22
    • 2020-01-17
    • 1970-01-01
    • 2015-09-27
    相关资源
    最近更新 更多