我不确定我问的问题是否正确,但让我解释一下。
首先,我阅读了这篇解释声明和定义之间区别的文章: http://www.cprogramming.com/declare_vs_define.html
其次,我从之前的研究中了解到,在头文件中定义变量和函数是一种不好的做法,因为在链接阶段,您可能对同一个名称有多个定义,这会引发错误。
但是,为什么类不会发生这种情况?根据另一个 SO 答案( What is the difference between a definition and a declaration? ), 以下将是一个类定义:
class MyClass {
private:
public:
};
如果上面的定义在一个头文件中。然后,据推测,您可以拥有多个 #include 该 header 的 .cpp 文件。这意味着该类在多个 .o 文件中编译后定义了多次,但似乎并没有引起太大问题......
另一方面,如果它是一个在头文件中定义的函数,它显然会导致问题......据我所知......也许吧?
那么类定义有什么特别之处呢?
最佳答案
单一定义规则(3.2,[basic.def.odr])以不同方式应用于类和函数:
1 - No translation unit shall contain more than one definition of any variable, function, class type, enumeration type, or template.
[...]
4 - Every program shall contain exactly one definition of every non-inline function or variable that is odr-used in that program [...]
因此,虽然(非内联)函数在整个程序中最多可以定义一次(如果它们被调用或以其他方式使用,则只能定义一次),类的定义次数可能与您拥有的翻译单元一样多(来源文件),但每个翻译单元不超过一次。
这样做的原因是因为类是类型,它们的定义对于能够在翻译单元之间共享数据是必要的。最初,类(C 中的struct
)没有任何需要链接器支持的数据; C++ 引入了虚拟成员函数和虚拟继承,这需要链接器支持 vtable,但这通常通过将 vtable 附加到成员函数(的定义)来解决。
关于c++ - 为什么在头文件中定义类不会出现多重定义错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14654377/