下面这段代码,保存为.c文件:
inline void fff(void)
{
}
int main(void)
{
fff();
}
gcc7.5编译出错:
image.png
如果你去网上搜索C inline的问题,会找到很多令你更困惑的解答。比如这个:
image.png
看到这个,你会说:“不对啊,我这编译出错就是因为gcc没有给我的inline函数生成汇编代码段啊?按这个说法,extern inline才肯定会编译出错的对吧?那我试试。”
image.png
然而,编译却成功了。
为什么会这样?请看下面两张截图:
-
inline
image.png -
extern inline
image.png
这么一对比就看出来了,gnu90及之前、gnu99及之后的标准对inline、extern inline的处理不同。
所以,如果你在网上看到的解释跟你测试的结果不一致,那只是因为作者在讲c90/c89/gnu89/gnu90标准。
在gcc onlinedocs里给出了inline函数使用的两种方法:
- static inline声明+定义
- extern声明+inline定义
建议只使用方法1,忘了inline和extern inline吧。
这篇文章总结得很全面、准确:关于各版本C语言标准中inline说明符的语义 - 知乎 (zhihu.com)