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

问题描述 投票:0回答:1

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

  • 我听说我们可以使用
    extern
    来访问“非静态实体” (就像未使用静态键声明的实体)来自其他 文件
    = 是的!我明白了
  • 他们说我们可以使用
    inline
    来创建函数或变量 出现在“头文件”中,以便可以跨多个访问 翻译单位
    = 是的!我明白了
  • 他们还说“内联实体”可以有“内部或 外部链接”
    =我没明白

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

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

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

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

c++ inline linkage
1个回答
1
投票

您链接的答案与 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() { }
}

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

函数不必是内联函数才能在多个 TU 中访问。

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

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

没有。如果它可以在多个翻译单元中访问,那么它不应该具有内部链接。内部链接的好处是您可以在不同的 TU 中使用相同的名称对其进行不同的定义。标头中的

static inline
是 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() {}
© www.soinside.com 2019 - 2024. All rights reserved.