【问题标题】:Does inline function result in creation of weak symbols?内联函数会导致创建弱符号吗?
【发布时间】:2016-05-12 19:07:53
【问题描述】:

编程语言:C

在我们的工作中,我们有一个项目,它有一个头文件,比如 header1.h 。该文件包含一些被声明为外部作用域的函数(通过 extern),并且在同一个头文件(header1.h)中也被定义为内联。

现在这个文件包含在不同 C 文件的多个位置。 我的理解是,根据我过去的 GCC 经验,它会产生多个定义的错误,这就是我所期望的。但在我们的工作中,我们没有遇到这些错误。唯一不同的是我们使用了不同的编译驱动。

根据我过去的经验,我的最佳猜测是,符号在编译时生成为弱符号,链接器正在使用该信息来选择其中一个。

定义为内联的函数会导致弱符号吗?有没有可能,还是有其他原因。

如果内联会导致创建弱符号,是否有一个功能可以关闭或打开它。

【问题讨论】:

  • 不,弱符号是 GNU 扩展,甚至没有在标准 AFAIK 中定义。 inline 函数具有特殊语义,您可以在 Stack Overflow 上的某个地方查找。
  • @Downvoter 弱符号是ELF standard 的一部分:弱符号表示链接可执行和可链接格式 (ELF) 目标文件期间的特殊注释符号。 ...
  • @AndrewHenle 当然,我的意思是 C 标准,我忘记写了。作为 ELF 标准的一部分,它不是特定于 GNU 的扩展,而是使其成为实现定义的,独立于标准。

标签: c gcc compiler-errors


【解决方案1】:

如果函数是内联的,则每次使用该函数时都会复制整个函数体(而不是正常的汇编器调用/返回语义)。

(现代编译器,使用内联作为提示,实际结果可能只是一个静态函数,在它使用的每个编译文件中都有唯一的副本)

【讨论】:

  • 谢谢。但是要明确一个问题,当您说“实际结果可能只是一个静态函数”时,您的意思是静态存储类。因此,具有 inline void func1(void ) { } 等定义的函数将被替换为 static void func1(void) { }。你是这个意思吗?
  • 是的。所有静态和内联函数,编译器使用源中的输入作为提示和优化标志来选择最佳解决方案。至少是最现代的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-11
  • 1970-01-01
  • 2019-09-24
相关资源
最近更新 更多