[英]Why do inline functions have external linkage by default?
标准说,给出声明
inline void foo();
foo
是一个带有外部链接的内联函数 (因为默认情况下所有函数声明都有外部链接)。 这让我很奇怪。 因为一个定义规则第3.2节(在C ++ 03和C ++ 11中)都说:
3 ...应在每个使用它的翻译单元中定义内联函数。
5 [n] ...内联函数可以有多个定义与外部联系(7.1.2)......给定这样一个名为D的实体在多个翻译单元中定义... D的每个定义应由相同的令牌序列组成
这意味着内联函数也可能具有内部链接,因为通过外部链接(即跨翻译单元)以任何方式使用函数将调用未定义的行为(通过第3段),并且所有翻译单元中的内联功能需要相同。
此规则是否存在向后兼容性或特定工具链的原因?
该决定的一个结果是在内联函数内定义的静态变量将在函数的所有实例化之间共享。 如果默认值是内部链接,则每个翻译单元都会获得自己的静态变量副本。 这不是人们期望事情发生的方式 - 内联与非内联不应该如此彻底地影响代码语义。
Jonathan Schilling在文章中对此进行了恰当的回答: Extern Inlines By Default 。
引用他关于这一变化的动机:
这一变化的直接动机是需要在同一次会议上通过的新模板编制模型; 但更普遍的是,人们认为改变默认值是一个时机已经到来的想法,并且这一变化在ANSI和ISO中得到了一致的批准。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.