我读到了在源文件中定义静态数据成员的原因,是因为如果它们在头文件中并且多个源文件包含在头文件中,则定义将多次输出。我可以看到为什么这对于静态const数据成员来说是个问题,但是为什么对静态数据成员来说这是个问题呢?
我不太确定我是否完全理解如果将定义写在头文件中为什么会有问题...
最佳答案
我认为您在混淆两件事:static
数据成员和全局变量标记为static
。
后者具有内部链接,这意味着,如果将它们的定义放在多个转换单元#include
的头文件中,则每个转换单元将收到这些变量的私有副本。
默认情况下,标记为const
的全局变量具有内部链接,因此您无需为这些变量显式指定static
。因此,链接程序将不会抱怨全局const
变量或标记为const
的全局非static
变量的多个定义,而在其他情况下则会抱怨(因为这些变量将具有外部链接)。
关于static
数据成员,这就是C ++ 11标准的9.4.2 / 5段所说的:
命名空间范围内的类的static
数据成员具有外部链接(3.5)。本地班级不得
static
数据成员。
这意味着,如果将它们的定义放在多个转换单元的头文件#include
d中,则最终将在相应的对象文件中得到相同符号的多个定义(与非const
全局变量完全一样),否无论他们的const
资格是什么。在这种情况下,您的程序将违反One Definition Rule。
另外,this Q&A on StackOverflow可以使您对主题有更清晰的了解。
关于c++ - 声明普通类和类模板的静态数据成员,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15443901/