当我尝试构建这段代码时
inline void f() {}
int main()
{
f();
}
使用命令行
gcc -std=c99 -o a a.c
我收到链接器错误(未定义的引用f
)。如果我使用,错误就会消失static inline
or extern inline
而不仅仅是inline
,或者如果我编译-O
(所以该函数实际上是内联的)。
这种行为似乎是在 C99 标准的第 6.7.4 (6) 段中定义的:
如果翻译单元中函数的所有文件范围声明都包含inline
不带函数说明符extern
,那么该翻译单元中的定义就是内联定义。内联定义不提供函数的外部定义,并且不禁止另一个翻译单元中的外部定义。内联定义提供了外部定义的替代方案,翻译器可以使用它来实现对同一翻译单元中的函数的任何调用。未指定对函数的调用是使用内联定义还是外部定义。
如果我理解正确的话,一个定义了函数的编译单元inline
如上面的示例所示,仅当存在同名的外部函数时,才会一致地进行编译,并且我永远不知道是否调用了我自己的函数或外部函数。
这种行为难道不是完全愚蠢的吗?定义一个函数有用吗inline
没有static
or extern
在C99中?我错过了什么吗?
答案摘要
当然,我错过了一些东西,而且这种行为并不愚蠢。 :)
As 尼莫解释,这个想法是把定义函数的
inline void f() {}
在头文件中只有一个宣言
extern inline void f();
在相应的.c 文件中。只有extern
声明触发外部可见的二进制代码的生成。而且确实没有什么用处inline
在 .c 文件中——它仅在标头中有用。
As the 乔纳森的回答中引用了 C99 委员会的基本原理说明,inline
都是关于编译器优化,要求函数的定义在调用处可见。这只能通过将定义放入标头中来实现,当然,标头中的定义不能在每次编译器看到它时都发出代码。但由于编译器并不强制实际内联函数,因此某个地方必须存在外部定义。
其实这个优秀的答案也回答了你的问题,我认为:
外部内联有什么作用?
这个想法是,“inline”可以在头文件中使用,然后在 .c 文件中使用“extern inline”。 “extern inline”只是指示编译器哪个目标文件应包含(外部可见)生成的代码的方式。
[更新,详细说明]
我认为 .c 文件中的“内联”(没有“静态”或“外部”)有任何用处。但在头文件中它是有意义的,并且它需要在某些 .c 文件中相应的“extern inline”声明才能实际生成独立代码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)