为什么没有多重定义错误,当你在头文件中定义一个类?(Why is there no multiple

2019-08-16 16:50发布

我不知道如果我没有问这个问题,但让我解释一下。

首先,我读了这篇文章,解释声明和定义的区别: http://www.cprogramming.com/declare_vs_define.html

其次,我从以前的研究中得知,这是因为在链接阶段,你可能有这将抛出一个错误多个同名的定义不好的做法,定义在头文件中的变量和函数。

然而,为什么不这样做的课吗? 根据另一SO回答( ?是什么的定义和声明的区别 ),以下将是一个类定义:

    class MyClass {
        private:
        public:
    };

如果上述定义是在头文件中。 然后,想必,你可以有#包含该头多个.cpp文件。 这意味着类在多个.o文件编译后的定义多次,但似乎并没有引起太多的问题...

在另一方面,如果它是一个功能被在头文件中定义的,它显然会从...导致问题我的理解...... MAYB?

那么什么特别之处类的定义?

Answer 1:

一定义规则 (3.2,[basic.def.odr])不同地适用于的类和函数:

1 - 无翻译单元应包含任何变量,函数,类型,枚举类型,或模板的多于一个的定义。

[...]

4 - 每个程序应包含在该程序中所ODR使用的每个非内联函数或变量的正好一个定义[...]

因此,虽然(非内联)功能可在整个程序最多一次定义(并只有一次,如果他们被称为或以其它方式使用ODR-),类别可以为你翻译单元(源文件)定义为多次,但不超过每翻译单元一次。

这样做的原因是,由于类的类型,他们的定义是必要的,能够翻译单元之间共享数据。 最初,类( struct用C S)不具有需要接头支持任何数据; C ++引入了虚拟成员函数和虚拟继承,这需要对V表的接头支撑,但是这通常是通过将V表至(定义)的成员函数周围的工作。



Answer 2:

类定义只是一种该类的对象蓝图。 它已经用相同的struct因为C天。 无类或结构实际上存在于代码本身。



Answer 3:

您的类定义定义的类,但没有定义与该类的对象 。 这是确定有在多个文件中定义的类(或结构),因为你只是定义一个类型 ,该类型的不是一个变量。 如果你只是有定义,没有代码会被编译器发出的。
编译器实际发射码后,才声明这种类型的对象(即,变量):

class MyClass myvar;

要么:

class MyOtherClass { 
    public: ...
    private: ...
} myvar;         // note the variable name, it instantiates a MyOtherClass

这就是你不想在头做的,因为它会导致被实例化MYVAR的多个实例什么。



文章来源: Why is there no multiple definition error when you define a class in a header file?