下面這段代碼卒茬,保存為.c文件:
inline void fff(void)
{
}
int main(void)
{
fff();
}
gcc7.5編譯出錯(cuò):
image.png
如果你去網(wǎng)上搜索C inline的問題,會(huì)找到很多令你更困惑的解答蓄拣。比如這個(gè):
image.png
看到這個(gè)扬虚,你會(huì)說:“不對(duì)啊,我這編譯出錯(cuò)就是因?yàn)間cc沒有給我的inline函數(shù)生成匯編代碼段扒蛐簟辜昵?按這個(gè)說法,extern inline才肯定會(huì)編譯出錯(cuò)的對(duì)吧咽斧?那我試試堪置。”
image.png
然而张惹,編譯卻成功了舀锨。
為什么會(huì)這樣?請(qǐng)看下面兩張截圖:
-
inline
image.png -
extern inline
image.png
這么一對(duì)比就看出來了宛逗,gnu90及之前坎匿、gnu99及之后的標(biāo)準(zhǔn)對(duì)inline、extern inline的處理不同雷激。
所以替蔬,如果你在網(wǎng)上看到的解釋跟你測(cè)試的結(jié)果不一致,那只是因?yàn)樽髡咴谥vc90/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語(yǔ)言標(biāo)準(zhǔn)中inline說明符的語(yǔ)義 - 知乎 (zhihu.com)