[問題] inline function導致Undefined reference

作者: zzss2003 (brotherD)   2020-01-01 18:35:32
程式碼: https://ideone.com/tLzUTW
文章: https://www.geeksforgeeks.org/inline-function-in-c/
文章裡的說法是:
"Normally GCC’s file scope is “not extern linkage”. That means inline
function is never ever provided to the linker which is causing linker error,
mentioned above. "
基於看不懂上述英文的解釋,請問是什麼原因導致compiler error?
作者: Fenikso (薪水小偷)   2020-01-02 00:03:00
簡單的說, linker要一份 "所有trnaslation unit都看得到的 foo" (不管有沒有人真的用到, 反正他就是要)但是你的inline foo只有自己這個translation unit看得到linker就不開心了
作者: lovejomi (JOMI)   2020-01-02 21:35:00
實際上compile沒問題,看不懂到底為啥說會error
作者: Lipraxde (Lipraxde)   2020-01-02 22:18:00
連結裡的內容看不懂+1
作者: Fenikso (薪水小偷)   2020-01-02 22:42:00
要用gcc -O0才會看到error
作者: dces4212 (flawless)   2020-01-02 23:56:00
只看懂gcc把inline置換(不考慮優化)了,可是為什麼linker還會要需要foo的symbol呢?求懂的大大解說,感謝
作者: Fenikso (薪水小偷)   2020-01-03 00:06:00
因為你有宣告而且在code裡面有用到, linker就要去找定義linker不知道唯一用到的地方被inline換掉了他只知道有個undefined symbol在symbol table上面
作者: Lipraxde (Lipraxde)   2020-01-03 10:47:00
真的有耶,以前都沒注意到
作者: dces4212 (flawless)   2020-01-04 02:18:00
了解 感謝解說
作者: lantw44 (#######################)   2020-01-04 13:00:00
當你 gcc 開 -O0 的時候,即使寫了 inline,gcc 也不會真的去 inline,因此會需要一個內部或外部可見的版本。由於只有在成功 inline 時才會使用它,沒有成功 inline 的時候就會找不到這個函式。要讓 inline 函式在檔案內能當普通函式使用可以加 static要讓 inline 函式在其他檔案也能當普通函式可以加 extern

Links booklink

Contact Us: admin [ a t ] ucptt.com