18

该标准说,给定一个声明

inline void foo();

foo是一个具有外部链接的内联函数(因为默认情况下所有函数声明都具有外部链接)。这让我觉得很奇怪。因为一个定义规则第 3.2 节(在 C++03 和 C++11 中)说:

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

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

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

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

4

2 回答 2

18

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

于 2012-02-16T04:38:27.920 回答
9

Jonathan Schilling 的文章在此处恰当地回答了这个问题:默认情况下的外部内联。

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

这种变化的直接动机是需要在同一次会议上通过的新模板编译模型;但更普遍的是,人们认为更改默认值是一个时机成熟的想法,并且该更改在 ANSI 和 ISO 中都得到了一致批准。

于 2012-02-16T04:33:13.270 回答