2016-05-12 68 views
1

编程语言:C内联函数是否会导致创建弱符号?

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

现在这个文件包含在不同C文件的几个地方。 我的理解是,它会产生一个错误的多重定义与我以前的GCC经验,这就是我所期望的。但在我们的工作中,我们没有得到这些错误。唯一的区别是我们使用不同的编译器驱动程序。

从我过去的经验来看,我所做的最好的猜测是,符号在编译时产生为弱符号,链接器使用这些信息来选择其中的一个。

定义为内嵌结果的函数是否会导致弱符号?这是可能的,还是可能有其他原因。

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

+0

无,弱符号是一个GNU扩展和甚至没有在标准AFAIK中定义。 'inline'函数具有特殊的语义,您可以在Stack Overflow上查找某处。 – Downvoter

+0

@Downvoter弱符号是[ELF标准](https://en.wikipedia.org/wiki/Weak_symbol)的一部分:*弱符号表示链接可执行文件和可链接格式(ELF)目标文件时特别注释的符号。 ... * –

+0

@AndrewHenle当然,我的意思是C标准,我忘了写这个。作为ELF标准的一部分,它不是GNU特定的扩展,而是使其实现定义,而与标准无关。 – Downvoter

回答

1

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

(现代编译器,在线使用的提示,与实际结果可能只是一个静态函数,在每一个编译文件的唯一副本,它被用来)

+0

谢谢。但是只有一个问题很明确,当你说“实际结果可能只是一个静态函数”时,你指的是静态存储类。因此,一个定义如inline void func1(void){}的函数将被替换为static void func1(void){}。你是这个意思吗 ? – user3750952

+0

是的。所有静态和内联函数,编译器选择哪种解决方案最好,将源中的输入用作提示和优化标志。至少最现代的。 –