我正在通过C ++教程,在预处理器/头文件的一篇文章中,作者创建了2个头文件' (当然不是技术术语),example.h和example.cpp。在example.h中,他为函数和标题保护放置了前向声明,在example.cpp中放置了函数的实际主体。为什么是这样?我尝试将函数的主体放在example.h文件中并且它工作正常,那么为什么他将它单独放置?它是习惯性的,还是在更大的问题上造成问题?或者是什么?
有人可以赐教我这个......
答案 0 :(得分:2)
C ++有一个名为一个定义规则的规则,它说每个函数都需要定义一次且只有一次(此规则有一些例外,但我们会忽略它们现在。)通常包含在头文件中的函数原型是声明表示函数存在,而.cpp文件中的实现是定义给出函数的代码。
如果您将函数的定义放在头文件中,然后在多个位置包含头文件,那么您将会遇到链接器错误,因为您正在违反一个定义规则 - 每个.cpp文件都是&。 #39;编译后将拥有自己的函数定义副本。另一方面,如果您只是将声明放在标题中,然后将定义放在单个源文件中,那么只有一个定义而且没有任何内容会破裂。
一个定义规则有一些例外。首先,所有内联函数都免于ODR,因此如果标记所有函数{{1}},您可能会将函数定义放在头文件中,尽管除了最小的函数之外,这通常不被认为是一个好主意。其次,模板函数免于ODR,其中(除其他外)是您在标题中定义模板函数的原因之一。
答案 1 :(得分:1)
将函数体放在example.h中。然后,当您编写第二个也包含example.h的.cpp文件,并将其与example.cpp链接时,您将收到链接器错误。链接器将在example.h中看到函数的2个定义。
答案 2 :(得分:0)
如果您想使用自定义链接配置,那么您只需在头文件中声明非常重要的函数。例如,如果函数在文件对象中定义并在另一个对象中使用,则链接器必须具有相同的引用才能链接两个不同的文件。