在课堂里:
class foo
{
public:
static int bar; //declaration of static data member
};
int foo::bar = 0; //definition of data member
我们必须显式定义静态变量,否则会导致
undefined reference to 'foo::bar'
我的问题是:
为什么我们必须给出静态变量的显式定义?
Please note that this is NOT a duplicate of previously asked undefined reference to static variable
questions. This question intends to ask the reason behind explicit definition of a static variable.
从一开始,C++ 语言就像 C 语言一样,是建立在以下原则之上的:独立翻译。每个翻译单元均由编译器本身独立完成,无需了解其他翻译单位。整个程序只有在稍后的链接阶段才会组合在一起。链接阶段是最早的阶段entire程序被看到linker(它被视为由编译器本身).
为了支持这一原则独立翻译,每个具有外部链接的实体必须在一个翻译单元中定义,并且只能在一个翻译单元中定义。用户负责在不同的翻译单元之间分配此类实体。它被认为是一部分用户意图,即用户应该决定哪个翻译单元(和目标文件)将包含每个定义。
这同样适用于类的静态成员。类的静态成员是具有外部链接的实体。编译器希望您在某个翻译单元中定义该实体。此功能的全部目的是让您有机会choose那个翻译单位。编译器无法为您选择它。再说一遍,这是你意图的一部分,是你必须要做的事情tell编译器。
这不再像以前那么重要,因为该语言现在被设计为处理(并消除)大量相同的定义(模板、内联函数等),但单一定义规则仍然是植根于原则独立翻译.
除了上述内容之外,在 C++ 语言中,定义变量的点将决定其相对于同一翻译单元中定义的其他变量的初始化顺序。这也是一部分用户意图,即如果没有您的帮助,编译器无法决定。
从 C++17 开始,您可以将静态成员声明为inline
。这消除了单独定义的需要。通过以这种方式声明它们,您可以有效地告诉编译器您不关心该成员的物理定义位置,因此也不关心其初始化顺序。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)