外部内联函数会发生什么?

如果我在.h文件中定义我的函数会发生什么

extern int returnaint(void); 

,在相关的.c文件中定义它

 inline int returnaint(void) { return 1; } 

并在另一个.c文件中包含标题并使用该函数? 当我单独编译事物,为每个.c文件创建一个目标文件然后链接它们时,是否包含内联函数,或者会发生什么?

我知道编译器可以忽略inline ,但是如果它在这种情况下不忽略它呢?

inline添加到.c文件中的函数定义只是多余的。

  • 您的.c文件的编译单元看到extern声明(没有inline )和inline定义。 因此,它会在目标文件中发出函数的符号。

  • 所有其他编译单元只能看到extern声明,因此如果您将最终可执行文件与另一个.o文件链接,它们可以毫无问题地使用该函数。

事实上,你只是错误的方式。 此function旨在用于您在.h文件中具有inline定义,对每个人都可见。 该函数的定义仅作为符号的声明,就像extern一样,但不定义它。

只有一个.c文件(编译单元)中的extern声明确保在那里定义符号。

术语有点令人困惑, inline 定义充当符号的声明, extern 声明充当它的定义

它不会编译。 来自C11(ISO / IEC 9899:2011)§6.7.4 函数说明符 (重点已添加):

具有内部链接的任何函数都可以是内联函数。 对于具有外部链接的函数,以下限制适用: 如果使用内联函数说明符声明函数,则它也应在同一转换单元中定义。 如果转换单元中函数的所有文件范围声明都包含不带extern的内联函数说明符,则该转换单元中的定义是内联定义。 内联定义不提供函数的外部定义,也不禁止另一个转换单元中的外部定义。 内联定义提供了外部定义的替代方案,翻译器可以使用该定义在同一翻译单元中实现对该function的任何调用。 未指定对函数的调用是使用内联定义还是使用外部定义。 140)

140)由于内联定义不同于相应的外部定义以及其他翻译单元中的任何其他相应内联定义,因此具有静态存储持续时间的所有相应对象在每个定义中也是不同的。

另一个.c文件只从头部获取inline函数的声明,但不获取定义,因此它与粗体字体的规则相反。

编辑:

正如@Jens Gustedt指出的那样,我之前的解释是错误的,因为在OP的问题中,函数在头文件中被声明为非内联:

 extern int returnaint(void); 

所以另一个.c文件会将其视为普通函数。

我们只是遇到了类似的问题,只在.c文件中保持内联解决了警告问题。 在具有和不具有function定义的两个文件中也发生加速。 使用-o3标志进行编译。