我正在阅读C ++入门手册(第5版),虽然到目前为止它是非常好的材料,但我发现在某些情况下,我遇到了令人头疼的解释,这些解释比答案。
在当前的例子中(强调我的粗体):
与其他函数不同,inline和constexpr函数可以在程序中多次定义。毕竟,编译器需要定义而不仅仅是声明,以便扩展代码。但是,给定内联或constexpr的所有定义必须完全匹配。因此,内联函数和constexpr函数通常在头文件中定义。
我已经对此做了一些研究,并且我已经看到了许多答案,只要定义相同,我就可以多次定义内联函数。 此外,我已经看到标准允许这样做。我很好奇的是:为什么?
是否存在可行的编码情况,我希望我的#include用于我想要的内联函数的给定头文件,只是在我的.cpp文件中提供重复的定义?我觉得我错过了这个规则适用的明显情况。为什么不这样做才能让你只能在标题,句点中定义一次内联函数,之后不用担心它?
一切顺利。
答案 0 :(得分:4)
答案非常简单:这样做是为了允许您在头文件中定义内联函数的主体。
由于头文件被粘贴"在引用它们的翻译单元内逐字逐句,标题内的任何函数定义都将在该翻译单元内部结束。如果您包含来自多个文件的相同标头,则所有这些文件都将定义相同的功能,具有相同的定义(因为它们来自相同的标头)。
由于预编译阶段在编译之前完成,编译器不知道翻译单元的哪个部分来自标题,哪个部分来自cpp文件。这就是为什么标准作者更容易允许多个相同的定义。
答案 1 :(得分:1)
为什么不这样做才能让你只能在标题,句点中定义一次内联函数,之后不用担心它?
我能想到的原因。
编译器无法执行它。它处理的内容已经过预处理。
此外,强制仅在头文件中定义内联函数的限制性太强。您将在实际应用程序中找到仅在源文件中定义的大量类。如果这些课程不能使用inline
函数,那将是一种耻辱。