c++ - 链接器实际上如何处理多重定义的 `inline` 函数?

标签 c++ c linker inline

在 C 和 C++ 中,具有外部链接的 inline 函数当然可以在链接时有多个可用定义,假设这些定义全部(希望)相同。 (当然,我指的是使用 inline 链接规范声明的函数,而不是编译器或链接时优化器实际内联的函数。)

那么当常见的链接器遇到一个函数的多个定义时,它们通常做什么呢?特别是:

  • 是否所有定义都包含在最终的可执行文件或共享库中?
  • 函数的所有调用是否都链接到相同的定义?
  • 一个或多个 C 和 C++ ISO 标准是否要求回答上述问题?如果不是,大多数常见平台是否做同样的事情?

附言是的,我知道 C 和 C++ 是不同的语言,但它们都支持 inline,并且它们的编译器输出通常可以通过相同的链接器链接(例如 GCC 的 ld),所以我相信他们在这方面不会有任何区别。

最佳答案

如果函数实际上是内联的,那么就没有什么可以链接的了。只有在出于某种原因,编译器决定扩展内联函数时,它才必须生成函数的外联版本。如果编译器为多个翻译单元生成函数的外联版本,您最终会得到多个具有相同“内联”函数定义的目标文件。

外联定义被编译到目标文件中,并被标记,这样如果该名称有多个定义,链接器就不会报错。如果不止一个,链接器只选择一个。通常是它看到的第一个,但这不是必需的,如果定义都相同,也没关系。这就是为什么对同一个内联函数有两个或多个不同的定义是未定义的行为:没有选择哪一个的规则。任何事情都有可能发生。

关于c++ - 链接器实际上如何处理多重定义的 `inline` 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35233468/

相关文章:

C++ getpid() 与 syscall(39)?

c++ - c语言中bool for function

c++ - 在 C++ 项目中链接 Paho C Mqtt 库错误

c# - 我在说 "Assertion failed"之前从未见过的奇怪的 xCode 链接器错误

c++ - 初始化 Glew - Visual Studio 2012 中的链接器错误

c++ - 在 C++ 中将 long long 转换为字节数组并返回

c++ - std::reference_wrapper 的大小有任何保证吗?

c++ - 对具有私有(private)变量的类 vector 使用排序

c - 将数字打印为十六进制数

c - 在c中用变量格式化字符串