Cod*_*rus 10 c++ linker header-files
我不确定我是否正确地提出了这个问题,但让我解释一下.
首先,我读了这篇解释声明和定义之间差异的文章:http: //www.cprogramming.com/declare_vs_define.html
其次,我从之前的研究中了解到,在头文件中定义变量和函数是不好的做法,因为在链接阶段,您可能有多个同名的定义会引发错误.
但是,为什么课不会发生这种情况呢?根据另一个SO答案( 定义和声明之间有什么区别?),以下是一个类定义:
class MyClass {
private:
public:
};
Run Code Online (Sandbox Code Playgroud)
如果上面的定义是在头文件中.然后,据推测,您可以有多个.cpp文件#include该标头.这意味着在多个.o文件中编译后,类被多次定义,但似乎没有引起太多问题......
另一方面,如果它是在头文件中定义的函数,它会明显地引起问题...从我的理解... mayb?
那么类定义有什么特别之处呢?
eca*_*mur 12
的一个定义规则(3.2,[basic.def.odr])不同地适用于的类和函数:
1 - 任何翻译单元都不得包含任何变量,函数,类类型,枚举类型或模板的多个定义.
[...]
4 - 每个程序应包含该程序中使用的每个非内联函数或变量的一个定义[...]
因此,虽然(非内联)函数可以在整个程序中最多定义一次(并且如果它们被调用或者使用其他函数,则只需定义一次),可以将类定义为翻译单元(源文件)的次数,但每个翻译单元不超过一次.
这样做的原因是,由于类是类型,因此它们的定义对于能够在翻译单元之间共享数据是必要的.最初,类(structC中的类)没有任何需要链接器支持的数据; C++引入了虚拟成员函数和虚拟继承,这需要链接器支持vtable,但这通常通过将vtable附加到成员函数的(定义)来解决.
| 归档时间: |
|
| 查看次数: |
1382 次 |
| 最近记录: |