下面這段代碼,保存為.c文件:
inline void fff(void)
{
}
int main(void)
{
fff();
}
gcc7.5編譯出錯:

image.png
如果你去網(wǎng)上搜索C inline的問題,會找到很多令你更困惑的解答。比如這個:

image.png
看到這個,你會說:“不對啊,我這編譯出錯就是因為gcc沒有給我的inline函數(shù)生成匯編代碼段啊?按這個說法,extern inline才肯定會編譯出錯的對吧?那我試試?!?br>

image.png
然而,編譯卻成功了。
為什么會這樣?請看下面兩張截圖:
-
inline
image.png -
extern inline
image.png
這么一對比就看出來了,gnu90及之前、gnu99及之后的標(biāo)準(zhǔn)對inline、extern inline的處理不同。
所以,如果你在網(wǎng)上看到的解釋跟你測試的結(jié)果不一致,那只是因為作者在講c90/c89/gnu89/gnu90標(biāo)準(zhǔn)。
在gcc onlinedocs里給出了inline函數(shù)使用的兩種方法:
- static inline聲明+定義
- extern聲明+inline定義
建議只使用方法1,忘了inline和extern inline吧。
這篇文章總結(jié)得很全面、準(zhǔn)確:關(guān)于各版本C語言標(biāo)準(zhǔn)中inline說明符的語義 - 知乎 (zhihu.com)

