为什么内联函数默认具有外部链接?

时间:2012-02-16 04:05:40

标签: c++ c++11 inline linkage c++03

标准说明了

的声明
inline void foo();

fooinline function with external linkage(因为默认情况下所有函数声明都有外部链接)。这让我很奇怪。因为一个定义规则部分3.2(在C ++ 03和C ++ 11中)都说:

  

3 ...内联函数应在每个使用它的翻译单元中定义。

     

5 [n] ...内联函数可以有多个定义与外部链接(7.1.2)...给定这样一个名为D的实体在多个翻译单元中定义...每个定义D应由相同的令牌序列组成

这意味着内联函数也可能具有内部链接,因为通过外部链接(即跨翻译单元)以任何方式使用函数将调用未定义的行为(通过第3段),并且所有翻译单元中内联函数的内容必须相同。

此规则是否存在向后兼容性或特定工具链原因?

2 个答案:

答案 0 :(得分:18)

该决定的一个结果是内联函数中定义的静态变量将在函数的所有实例化之间共享。如果默认值是内部链接,则每个翻译单元都会获得自己的静态变量副本。这不是人们期望事情发生的方式 - 内联与非内联不应该如此严重地影响代码语义。

答案 1 :(得分:9)

这一点在Jonathan Schilling的文章中得到了恰当的回答: Extern Inlines By Default

引用他关于这种变化的动机:

  

这一变化的直接动机是需要在同一次会议上采用的新模板编制模型;但更普遍的是,有人认为更改默认值是一个时机已经到来的想法,并且这一变化在ANSI和ISO中得到了一致的批准。