我有一个严重的问题,以我浅薄的知识来调和“内联概念”与“链接”:
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() { }
}
可以从多个翻译单元的任何位置访问内联实体,所以这是否意味着“内联实体”应该始终具有“外部链接”?
函数不必是内联函数才能在多个 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() {}