为什么需要在类之外定义静态数据成员?

2022-01-05 00:00:00 static c++

根据 静态数据成员在 IBM C++ 知识中心:

According to Static data members on the IBM C++ knowledge center:

类的成员列表中静态数据成员的声明不是定义.您必须在类声明之外的命名空间范围内定义静态成员.

The declaration of a static data member in the member list of a class is not a definition. You must define the static member outside of the class declaration, in namespace scope.

这是为什么?关于内存分配的原理图是什么?

Why is that? What's the schematic behind that regarding the memory allocation?

推荐答案

这是语言的一条规则,称为一个定义规则.在一个程序中,每个静态对象(如果使用的话)必须定义一次,而且只能定义一次.

It's a rule of the language, known as the One Definition Rule. Within a program, each static object (if it's used) must be defined once, and only once.

类定义通常在头文件中,包含在多个翻译单元中(即来自多个源文件).如果标题中的静态对象声明是一个定义,那么您最终会得到多个定义,每个包含标题的单元中都有一个定义,这会破坏规则.因此,它不是一个定义,您必须在其他地方提供一个定义.

Class definitions typically go in header files, included in multiple translation units (i.e. from multiple source files). If the static object's declaration in the header were a definition, then you'd end up with multiple definitions, one in each unit that includes the header, which would break the rule. So instead, it's not a definition, and you must provide exactly one definition somewhere else.

原则上,该语言可以对内联函数执行它所做的事情,允许将多个定义合并为一个.但事实并非如此,所以我们坚持这条规则.

In principle, the language could do what it does with inline functions, allowing multiple definitions to be consolidated into a single one. But it doesn't, so we're stuck with this rule.

相关文章