【发布时间】:2026-01-22 03:20:15
【问题描述】:
在课堂上:
class foo
{
public:
static int bar; //declaration of static data member
};
int foo::bar = 0; //definition of data member
我们必须显式定义静态变量,否则会导致一个
<strong>undefined reference to 'foo::bar'</strong>
我的问题是:
为什么我们必须明确定义静态变量?
请注意,这不是与之前提出的 undefined reference to static variable 问题的重复。这个问题旨在询问显式定义的原因静态变量。
【问题讨论】:
-
如果这个类在一个用三个独立的翻译单元编译的头文件中,你如何确保不违反ODR,除非只有一个翻译单元在头文件之外有定义?
-
一些(阅读:恰好一个)编译单元需要包含对
foo::bar的引用。 -
@volerag,它几乎只是基于One Definition Rule。您可以将翻译单元视为一个 .cpp 文件,您将其与每个递归包含的头文件“粘贴”到该 .cpp 文件的顶部一起编译。当您开始组合翻译单元时,标题中定义的内容必然会被多次定义,除非它们被允许(如类定义)或特别注意(如此处讨论的变量)。
-
这在 C++11 中变得更有趣,它允许在类中初始化,因此在许多情况下,除非使用 odr,否则您不需要外部定义,但弄清楚何时使用 odr 可以是very tricky in many cases。
-
con't 然后你会看到一些像one from the draft C++14 standard 这样非常古怪的案例。