8

在这个答案https://stackoverflow.com/a/4193698/738811中写道“默认情况下内联函数具有外部链接”。但是,默认情况下不可能链接到内联的东西。那么说内联函数具有外部链接有什么意义呢?

4

4 回答 4

13

名称的链接与其在何处或如何定义无关,仅与名称可用于指代特定对象或功能的位置有关。

声明一个函数 inline 并不强制它被内联;它只是放宽了一个定义规则,以允许在使用它的每个翻译单元中进行定义(并且在调用它的每个翻译单元中都需要一个定义),以使其更容易内联。如果编译器决定不内联对它的特定调用,或者如果您获取它的地址,它不会阻止生成非内联版本。

所以“外联”和“内联”并不排斥;“外部链接”意味着该函数可以在任何翻译单元中被引用,“内联”意味着它必须在任何调用它的翻译单元中定义。

于 2013-05-05T16:02:22.780 回答
1

也许更好的表达方式是“如果需要链接,它将是外部的”。这意味着,如果您获取内联函数的地址,则该地址将在外部可见(不是模块的静态地址)。

于 2013-05-05T15:51:54.477 回答
0

内联函数不一定是内联扩展的。如果不是,则语言定义要求该函数只有一个副本。

于 2013-05-05T15:52:10.380 回答
0

内联函数通常可以从其他编译单元“链接”。它们不会显示为内联函数。编译文件中有该函数的副本。这适用于自由内联函数。类成员函数通常不会获取函数的副本以供“非内联”使用。如果从未引用过,好的链接器也会将代码作为“死代码”删除。

于 2013-05-05T15:53:27.357 回答