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

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

我正在学习 C++ 教程,在一篇关于 preprocessor/header 文件的文章中,作者创建了 2 'header files'(当然不是技术术语),example.h 和 example.cpp。在 example.h 中,他放置了函数的前向声明和 header 守卫,在 example.cpp 中放置了函数的实际 body。为什么是这样?我试过把函数的body放在example.h文件里,效果很好,那他为什么单独放呢?是习以为常,还是在更大的问题中造成问题?或者什么?

有人可以请教我这个吗...

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

将函数体放在example.h中。然后,当您编写第二个 .cpp 文件时,该文件还包含 example.h 和 link 它以及 example.cpp,然后您将收到 linker 错误。 linker 将在 example.h.

中看到函数的 2 个定义

C++ 有一个称为 one-definition 规则 的规则,它说每个函数都需要定义一次且仅一次(此规则有一些例外,但我们暂时忽略它们。)通常包含在 header 文件中的函数原型是一个 声明 说明函数存在,以及 .cpp 文件中的实现定义 给出函数的代码。

如果您将函数的定义放在 header 文件中,然后在多个地方包含 header 文件,您将遇到链接器错误,因为您违反了单一定义规则- 编译的每个 .cpp 文件都有自己的函数定义副本。另一方面,如果您只是将 声明 放在 header 中,然后将 定义 放在单个源文件中,那么只有一个定义,什么都不会破坏。

单一定义规则有一些例外情况。首先,所有内联函数都免于 ODR,因此如果您将所有函数标记为 inline,您可能会将函数定义放入 header 文件中,尽管这通常被认为不是一个好主意,除了最小的功能。其次,模板函数不受 ODR 的约束,这(除其他事项外)是您在 headers.

中看到模板函数定义的原因之一