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

标签 c++ function inline header-files member

我已阅读现有 answers关于inline的两种含义,我还是一头雾水。

假设我们有以下头文件:

// myclass.h

#ifndef INCLUDED_MYCLASS
#define INCLUDED_MYCLASS

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

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

#endif

为什么定义在文件类外的void foo(),必须用inline显式定义?

最佳答案

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

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

请注意, header 保护不会对此提供保护,因为它们仅在您在同一文件中多次包含相同 header 时提供保护。

虽然将函数定义标记为内联 意味着该定义在多个翻译单元中始终相同。1

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


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

关于c++ - 为什么必须内联定义在类外部(但在头文件中)的类成员函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50659971/

相关文章:

c++ - 是否可以在没有整个 System C 内核的情况下在 C++ 中使用 System C 数据类型?

c++ - 使用点积调整 glRotate

javascript - 多次单击可调用多个功能的按钮

C++ (VC) 文本输出用 0d 0d 0a 而不是 0d 0a 换行 - 如何修复?

c++ - 如何将字符空间动态分配给结构字段

function - 从 Matlab 中的其他工作区访问变量?

javascript - 使用纯 JavaScript,给定一个对象集合和一个过滤器对象,返回集合中与过滤器对象具有相同键/值对的对象

c++ - C++ 异常会阻止函数被内联吗?

go - 不内联简单函数

html - 如何删除内联元素之间空格的可见性?