为什么内联函数会有多个相同的定义?

Why would inline functions have multiple identical definitions?

我正在学习 C++ 入门(第 5 版),虽然到目前为止它真的很棒 material,但我发现在某些情况下我 运行 进入 head-scratching 解释这给我的问题多于答案。

在当前示例中(在粗体上强调我的):

Unlike other functions, inline and constexpr functions may be defined multiple times in the program. After all, the compiler needs the definition, not just the declaration, in order to expand the code. However, all of the definitions of a given inline or constexpr must match exactly. As a result, inline and constexpr functions normally are defined in headers.

我对此做了一些研究,并且看到很多答案,我可以多次定义内联函数只要定义相同。 此外,我已经看到标准允许这样做。我很好奇的是:为什么?

是否存在一种可行的编码情况,我可以将我的#include 用于我想要的内联函数的给定 header 文件,只是为了在我的 .cpp 文件中提供重复定义?我觉得我错过了适用此规则的明显情况。为什么不让它在 header 期间内只定义一次内联函数,之后就不用担心了?

祝一切顺利。

答案非常简单:这样做是为了允许您在 header 文件.

中定义 body 内联函数

由于 header 文件在引用它们的翻译单元中是 "pasted" 逐字记录的,因此 header 中的任何函数定义都将在该翻译单元中结束。如果您从多个文件中包含相同的 header,所有这些文件将定义相同的函数,具有相同的定义(因为它们来自相同的 header)。

由于预处理阶段是在编译之前完成的,因此编译器不知道翻译单元的哪一部分来自 header,而哪一部分存在于您的 cpp 文件中。这就是为什么标准编写者更容易允许多个相同的定义。

Why not just make it so you could only define the inline function once in the header, period, and not worry about it afterwards?

我能想到的原因

  1. 编译器将无法执行它。它处理的内容已经过预处理。

  2. 此外,强制仅在头文件中定义内联函数限制性太强。您会发现大量 类 仅在实际应用程序的源文件中定义。如果那些 类 不能使用 inline 功能将是一种耻辱。