我正在学习C++教程,在其中一篇关于预处理程序/头文件的文章中,作者创建了2个‘头文件’(当然不是技术术语),例如h和example.cpp。例如,他将函数和头保护的前向声明放在前面,在example.cpp中放置函数的实际正文。为什么会这样呢?我试着把函数的主体放在example.h文件中,它工作得很好,那么他为什么要把它分开呢?这是习惯性的,还是在更大的问题上造成了问题?不然呢?
谁能告诉我这件事..。
发布于 2016-08-09 13:29:36
C++有一个名为“一个定义规则”的规则,它规定每个函数只需要定义一次,而且只需要定义一次(这个规则有几个例外,但我们现在将忽略它们)。通常包含在头文件中的函数原型是声明函数存在的声明,.cpp文件中的实现是给出函数代码的定义。
如果将函数的定义放在头文件中,然后将头文件包含在多个位置,则会得到链接器错误,因为您违反了一个定义规则--每个已编译的.cpp文件都将有它自己的函数定义副本。另一方面,如果您只是将声明放在头文件中,然后将定义放在一个源文件中,那么只有一个定义,没有什么会中断。
一个定义规则有几个例外。首先,所有内联函数都不受ODR的限制,因此,如果标记所有函数inline
,则可以将函数定义放入头文件中,尽管对于所有函数(最小的函数除外)来说,这通常都不是一个好主意。其次,模板函数不受ODR的约束,ODR(除其他外)是看到标头中定义的模板函数的原因之一。
发布于 2016-08-09 13:25:18
以功能体为例。然后,当您编写包含example.h的第二个.cpp文件并将其链接到example.cpp时,您将得到一个链接器错误。链接器将在example.h中看到函数的两个定义。
发布于 2016-08-09 13:24:54
因为在头文件中,您只声明在使用自定义链接配置时非常重要的函数。例如,如果在文件对象中定义了函数,并在另一个对象中使用函数,则链接器必须对此函数具有相同的引用才能链接这两个不同的文件。
https://stackoverflow.com/questions/38860642
复制