![](/img/trans.png)
[英]What's the difference between static inline, extern inline and a normal inline function?
[英]What happens with an extern inline function?
如果我将 .h 文件中的函数定义为
extern int returnaint(void);
在相关的 .c 文件中将其定义为
inline int returnaint(void) {
return 1;
}
并将标题包含在另一个 .c 文件中并使用该函数? 当我单独编译这些东西时,为每个 .c 文件创建一个目标文件然后链接它们,是否包含内联函数,或者会发生什么?
我知道编译器可以忽略inline
,但是如果在这种情况下它不忽略它呢?
将inline
添加到.c
文件中的函数定义只是多余的。
您的.c
文件的编译单元会看到一个extern
声明(没有inline
)和一个inline
定义。 因此它发出目标文件中函数的符号。
所有其他编译单元只看到一个extern
声明,因此如果您将最终可执行文件与其他.o
文件链接,它们可以毫无问题地使用该函数。
事实上,你只是把它弄错了。 此功能旨在用于您在.h
文件中具有inline
定义,所有人都可以看到的情况。 函数的这个定义只作为符号的声明,就像extern
一样,但没有定义它。
仅在一个.c
文件(编译单元)中的extern
声明然后确保在那里定义符号。
术语有点混乱, inline
定义充当符号的声明,而extern
声明充当符号的定义
它不会编译。 来自 C11 (ISO/IEC 9899:2011) §6.7.4功能说明符(强调):
任何具有内部链接的函数都可以是内联函数。 对于具有外部链接的函数,以下限制适用:如果函数是用内联函数说明符声明的,则它也应在同一翻译单元中定义。 如果翻译单元中函数的所有文件范围声明都包含不带 extern 的内联函数说明符,则该翻译单元中的定义是内联定义。 内联定义不为函数提供外部定义,也不禁止另一个翻译单元中的外部定义。 内联定义提供了外部定义的替代方案,翻译器可以使用它来实现对同一翻译单元中的函数的任何调用。 未指定对函数的调用是使用内联定义还是外部定义。 140)
140)由于内联定义不同于对应的外部定义以及其他翻译单元中的任何其他对应内联定义,因此所有具有静态存储持续时间的对应对象在每个定义中也是不同的。
另一个.c
文件仅从标题中获取inline
函数的声明,而不是定义,因此它违反了粗体规则。
编辑:
正如@Jens Gustedt 指出的那样,我之前的解释是错误的,因为在 OP 的问题中,该函数在头文件中被声明为非内联:
extern int returnaint(void);
因此,另一个.c
文件会将其视为普通函数。
我们只是有一个类似的问题,仅在.c文件中保持内联即可解决警告问题。 在具有和不具有函数定义的两个文件中,也都发生了加速。 使用-o3标志进行编译。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.