"仅一个实施"规则的例外情况?

ere*_*eOn 10 c++ linker definition

在我阅读这个问题的接受答案时,我有以下问题:

通常,方法在头文件(.hpp或其他)中定义,并在源文件(.cpp或其他)中实现.

包含"源文件"(#include <source_file.cpp>)的不良做法的主要原因之一是其方法实现将被复制,从而导致链接错误.

当一个人写道:

#ifndef BRITNEYSPEARS_HPP
#define BRITNEYSPEARS_HPP

class BritneySpears
{
  public:

    BritneySpears() {}; // Here the constructor has implementation.
};

#endif /* BRITNEYSPEARS_HPP */
Run Code Online (Sandbox Code Playgroud)

他正在给出构造函数的实现(这里是一个"空"实现,但仍然).

但是为什么然后多次包含这个头文件(也就是在不同的源文件上)不会在链接时生成"重复定义"错误?

Mik*_*our 13

内联函数是"一个定义规则"的例外:允许您在多个编译单元中具有相同的实现.如果函数inline在类定义中声明或实现,则它们是内联函数.

  • @nikie"内联函数"并不意味着对它的调用是内联的.它只是意味着它们得到链接器的特殊处理,因此程序中允许它们的多个定义.对于要内联的调用,这是必要的 - 因为只有这样,多个TU才能看到代码,而不仅仅是一个TU.但这还不够 - 编译器仍然可以使用普通的调用指令. (3认同)

sha*_*oth 7

在类定义中具有实现的成员函数被视为内联函数.内联函数不受一个定义规则的约束.

特别是当链接器看到具有相同签名的两个内联函数时,它将它们视为相同的函数,并且只选择其中一个.这可能导致非常难以发现问题.