为什么c++头函数放在一个单独的文件中?

Why are C++ header functions put in a seperate file?

本文关键字:单独 一个 文件 c++ 函数 为什么      更新时间:2023-10-16

我正在学习c++教程,在一篇关于预处理器/头文件的文章中,作者创建了2个'头文件'(当然不是技术术语),example.h和example.cpp。在example.h中,他提供了函数的前向声明和头保护,在example.cpp中,他提供了函数的实际体。为什么会这样?我试着把函数体放在example.h文件中,它工作得很好,那么他为什么要把它分开呢?这是惯例,还是会带来更大的问题?还是别的什么?

c++有一个名为单定义规则的规则,该规则表示每个函数需要定义一次且仅定义一次(该规则有一些例外,但我们现在将忽略它们)。头文件中通常包含的函数原型是一个声明,表示函数存在,而.cpp文件中的实现是定义,给出函数的代码。

如果你把函数的定义放在一个头文件中,然后在多个地方包含这个头文件,你会得到链接器错误,因为你违反了一个定义规则——编译的每个.cpp文件都有它自己的函数定义副本。另一方面,如果您只是将声明放在头文件中,然后将定义放在单个源文件中,那么只有一个定义,并且没有任何问题。

对于一个定义规则有一些例外。首先,所有内联函数都免除ODR,因此如果将所有函数标记为inline,则可能将函数定义放在头文件中,尽管除了最小的函数之外,这通常不被认为是一个好主意。其次,模板函数不受ODR的影响,这也是为什么在头文件中定义模板函数的原因之一。

将函数体放在example.h中。然后,当您编写第二个包含example.h的.cpp文件并将其与example.cpp链接时,您将得到一个链接错误。链接器将在example.h中看到该函数的两个定义。

因为在头文件中,只有当你想使用自定义链接配置时才声明真正重要的函数。例如,如果一个函数在一个文件对象中定义,并在另一个对象中使用,则链接器必须对该函数具有相同的引用以链接两个不同的文件。

相关文章: