Ran*_*ngo 3 c++ inline linkage
我有一个严重的问题,以我浅薄的知识来协调“内联概念”与“链接”:
extern从其他文件访问“非静态实体”(例如未使用静态密钥声明的实体)inline使函数或变量出现在“头文件”中,以便可以跨多个翻译单元访问它(A:具有内部链接的内联函数? - 这是我第一次听说具有“内部链接”的内联实体)
可以从多个翻译单元的任何位置访问内联实体,因此这是否意味着“内联实体”应该始终具有“外部链接”?
可以跨多个翻译单元从任何地方访问并具有“内部链接”的“内联实体”有什么意义?
任何答案或任何证实我在任何一点上都是错误的确认将不胜感激。
您链接的答案与 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)