gcc纯C语言inline函数链接出错问题

下面这段代码,保存为.c文件:

inline void fff(void)
{
}

int main(void)
{
    fff();
}

gcc7.5编译出错:


image.png

如果你去网上搜索C inline的问题,会找到很多令你更困惑的解答。比如这个:


image.png

看到这个,你会说:“不对啊,我这编译出错就是因为gcc没有给我的inline函数生成汇编代码段啊?按这个说法,extern inline才肯定会编译出错的对吧?那我试试。”
image.png

然而,编译却成功了。
为什么会这样?请看下面两张截图:

  1. inline


    image.png
  2. extern inline


    image.png

这么一对比就看出来了,gnu90及之前、gnu99及之后的标准对inline、extern inline的处理不同。
所以,如果你在网上看到的解释跟你测试的结果不一致,那只是因为作者在讲c90/c89/gnu89/gnu90标准。
在gcc onlinedocs里给出了inline函数使用的两种方法:

  1. static inline声明+定义
  2. extern声明+inline定义

建议只使用方法1,忘了inline和extern inline吧。
这篇文章总结得很全面、准确:关于各版本C语言标准中inline说明符的语义 - 知乎 (zhihu.com)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容