我想到的方式inline
在 C++ 中用于链接/作用域。我把它放在同一个篮子里extern
and static
对于全局对象。
通常,对于在头文件中实现的函数,我的首选解决方案是将其设为静态:
// In Foo.h
static void foo()
{
// Do stuff...
}
不过,我相信这也是有效的,并且似乎并不违反 ODR:
// In Foo.h
inline void foo()
{
// Do stuff...
}
两者之间的语义差异是什么?另外,我不太确定 C++ 标准的哪些领域可以解释确切的差异,或者它是否只是未定义且差异在于实现。
inline
准确表达您想要的内容:“请抑制此函数的 ODR(一个定义规则),以便每个翻译单元可以(并且必须)提供自己的函数定义副本”。
然后,编译器将内联调用该函数,或者将来自不同 TU 的函数定义合并在一起(以便生成的函数存在once在可执行文件中)。
static
另一方面,告诉编译器在定义该函数的每个翻译单元中生成该函数,而不是共享它。因此,最终的可执行文件中会存在任意数量的技术上独立的函数。
简而言之,如果您使用static
,那么在不同的翻译单元中获取函数的地址将返回不同的地址(因为您告诉编译器在每个 TU 中生成一个函数),但是如果您使用inline
,它们会显示相同的地址(因为您正在定义one函数,只是告诉编译器将许多定义合并在一起)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)