我不确定我是否正确地提出了这个问题,但让我解释一下。
首先,我读了这篇文章,解释了声明和定义之间的区别: http://www.cprogramming.com/declare_vs_define.html
其次,我从之前的研究中了解到,在头文件中定义变量和函数是不好的做法,因为在链接阶段,您可能有多个同名的定义会引发错误。
但是,为什么课不会发生这种情况呢?根据另一个SO答案( What is the difference between a definition and a declaration?),以下是一个类定义:
class MyClass {
private:
public:
};
如果上面的定义是在头文件中。然后,据推测,您可以有多个.cpp文件#include该标头。这意味着在多个.o文件中编译后,类被多次定义,但似乎没有引起太多问题......
另一方面,如果它是在头文件中定义的函数,它会显然导致问题...从我的理解... mayb?
那么类定义有什么特别之处呢?
答案 0 :(得分:12)
单定义规则(3.2,[basic.def.odr])对类和函数的应用不同:
1 - 任何翻译单元都不得包含任何变量,函数,类类型,枚举类型或模板的多个定义。
[...]
4 - 每个程序应该只包含该程序中使用的每个非内联函数或变量的一个定义[...]
因此虽然(非内联)函数可以在整个程序中最多定义一次(如果它们被调用或者使用其他函数,则只需定义一次),可以将类定义为翻译单元的次数(源文件),但每个翻译单位不超过一次。
原因是因为类是类型,它们的定义是能够在翻译单元之间共享数据所必需的。最初,类(C中的struct
)没有任何需要链接器支持的数据; C ++引入了虚拟成员函数和虚拟继承,它们需要链接器支持 vtable ,但这通常是通过将vtable附加到成员函数的(定义)来解决的。
答案 1 :(得分:1)
类定义只是该类对象的一种蓝图。自C天以来struct
就是这样。代码中实际上不存在任何类或结构。
答案 2 :(得分:0)
您的类定义定义了类,但没有定义该类的对象。在多个文件中定义类(或结构)是可以的,因为您只是定义类型,而不是该类型的变量。如果您只是定义了,编译器将不会发出任何代码。
只有在声明了这种类型的对象(即变量)后,编译器才会发出代码:
class MyClass myvar;
或:
class MyOtherClass {
public: ...
private: ...
} myvar; // note the variable name, it instantiates a MyOtherClass
这是你不想在标题中做的事情,因为它会导致实例化 myvar 的多个实例。