c++ - 为什么在头文件中定义类不会出现多重定义错误?

标签 c++ linker header-files one-definition-rule

我不确定我问的问题是否正确,但让我解释一下。

首先,我阅读了这篇解释声明和定义之间区别的文章: 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/

相关文章:

c++ - 变量类派生自某个抽象类的类模板

c# - 在虚幻引擎 C++ 中使用 C# 库

c++ - 我怎么知道哪些库被动态链接到静态库中?

c - 使用 union 时 .c include 文件中出现多个错误

c - 如何找到丢失的 C 头文件(没有 Internet)?

php - 流交互 As3 -> PHP -> Mysql -> C++

c++ - 具有相同名称功能的不同项目的 Visual Studio 解决方案

c - 使用不带名称修饰的 __stdcall 的 DLL : why does it even work?

c++ - 在类内部而不是在 C++ 外部定义成员函数?

c++ - 如何为输入和输出参数使用单独的参数包?