与链接相关的内联关键字的真正本质是什么?

Ran*_*ngo 3 c++ inline linkage

我有一个严重的问题,以我浅薄的知识来协调“内联概念”与“链接”:

  • 我听说我们可以用来extern从其他文件访问“非静态实体”(例如未使用静态密钥声明的实体)
    =是!我懂了
  • 他们说我们可以用来inline使函数或变量出现在“头文件”中,以便可以跨多个翻译单元访问它
    =是!我懂了
  • 他们还说“内联实体”可以有“内部或外部链接”
    =我不明白

(A:具有内部链接的内联函数? - 这是我第一次听说具有“内部链接”的内联实体)

可以从多个翻译单元的任何位置访问内联实体,因此这是否意味着“内联实体”应该始终具有“外部链接”?

可以跨多个翻译单元从任何地方访问并具有“内部链接”的“内联实体”有什么意义?

任何答案或任何证实我在任何一点上都是错误的确认将不胜感激。

Jan*_*tke 5

您链接的答案与 C 相关inline,其工作原理略有不同。然而,无论是哪种语言,inline都不影响链接。

inline在一个函数上使其成为内联函数。默认情况下,任何自由函数都具有外部链接,这基本上意味着f在多个翻译单元中声明的所有函数都引用相同的函数f。static将使功能具有内部联系,这意味着每个翻译单元都有自己的f。

// inline function with external linkage
inline void f() { }

// also an inline function with external linkage
extern inline void g() { }

// inline function with internal linkage
static inline void h() { }

namespace { // anonymous namespace
// also an inline function with internal linkage
inline void k() { }
}
Run Code Online (Sandbox Code Playgroud)

可以从多个翻译单元的任何位置访问内联实体,因此这是否意味着“内联实体”应该始终具有“外部链接”?

函数不必是内联函数才能在多个 TU 中访问。inline只是意味着它可以在多个 TU 中定义,而不仅仅是声明,并且这不会导致任何链接器错误(所有定义必须相同)。换句话说,对于内联函数,单一定义规则被放宽。是的,如上所述,自由函数默认具有外部链接,即使它们是inline.

可以跨多个翻译单元从任何地方访问并具有“内部链接”的“内联实体”有什么意义?

没有任何。如果它可以在多个翻译单元中访问,那么它不应该具有内部链接。内部链接的好处是您可以在不同的 TU 中使用相同的名称对其进行不同的定义。static inlinein headers 是 C 的反模式,其动机是与 C++ 不同,如果函数未内联,链接器将在某个目标文件中查找定义extern,而该定义可能不存在。

// assuming all of the following are defined in a header ...

// C: if f() isn't inlined, we get linker errors
//    to solve this, declare an extern inline definition in some source file
// C++: if f() isn't inlined, this is okay; the linker will pick one of N definitions,
//      which are automatically generated in the non-inlined case
inline void f() {}

// C: if h() isn't inlined, duplicates get emitted into multiple TUs
// C++: same, but this is stupid and avoidable; don't use 'static inline'
static inline void h() {}
Run Code Online (Sandbox Code Playgroud)