为什么在类外部(但在头文件中)定义的类成员函数必须内联?

And*_*kas 5 c++ inline function member header-files

我已经阅读了有关内联两种含义的现有答案,但我仍然感到困惑。

假设我们有以下头文件:

// myclass.h

#ifndef INCLUDED_MYCLASS
#define INCLUDED_MYCLASS

class MyClass
{
   public:
      void foo(); // declaration
};

inline void MyClass::foo()
{
    // definition
}

#endif
Run Code Online (Sandbox Code Playgroud)

为什么void foo()在文件中的类之外定义的 which 必须使用 显式定义inline

Rak*_*111 6

这是因为你MyClass::foo在头文件中定义了。或者更抽象一点,该定义将出现在多个翻译单元中(每个包含标头的 .cpp 文件)。

在程序中对变量/函数有多个定义违反了“单一定义”规则,该规则要求每个变量/函数在单个程序中只能有一个定义。

请注意,标头防护不能防止这种情况,因为它们仅在同一文件中多次包含相同标头时提供保护。

将函数定义标记为inline好像意味着该定义在多个翻译单元中始终相同。1 .

实际上,这意味着链接器将只使用第一个定义MyClass::foo并在任何地方使用它,而忽略其余的,


1:如果不是这种情况,则您的程序格式不正确,无需任何诊断。