[問題] static inline的使用時機

作者: wtchen (沒有存在感的人)   2016-06-15 03:09:39
開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
Linux + gcc 5.3.1 (-std=gnu11)
問題(Question):
正在寫關於inline的文章。
inline在C99/C11中可以有以下用法:
inline:看得到此函式的一律用inline(編譯器許可的話),看不到者不能用該函式
函式無對應的位址可供呼叫
除非該函式另外有同名的非inline版本
extern inline:
看得到此函式的一律用inline(編譯器許可的話),看不到者可用函式呼叫。
有對應的位址
static inline我就不懂了。
反正inline不能外部呼叫,為啥要多一個static?
使用的時機是什麼?
感謝
作者: EdisonX (卡卡獸)   2016-06-15 03:13:00
以 C 而言,global func. 加上 static 修飾 , 代表只能在該檔案被呼叫, 如 static void func() 放在 a.c , 就不能在 b.c 呼叫 func() ; 若不加 static 時,即使 a.h 沒加上void func();之宣告, b.c 仍可事先用extern void fun()宣告後,調用在 a.c 裡的 func()合在一起看,static inline void func(); 代表這個函式只能在某個特定檔案裡面被呼叫 , 而且在此檔案裡會建議編譯器直接展開 , 並沒衝突。(真正衝突的是extern和static)若以 c++ 來講,放在 class 裡面的話又是另一個故事了...
作者: CoNsTaR ((const *))   2016-06-15 17:26:00
沒加 static 別人可以自己用 extern 宣告inline 的意義是告訴使用者 “定義和宣告合併”
作者: wtchen (沒有存在感的人)   2016-06-15 17:29:00
不管inline有沒有成功都是嗎?
作者: CoNsTaR ((const *))   2016-06-15 17:30:00
隱含意義是 “只會有這個實作版本” 因為實作和宣告寫在一起了至於把程式片段取代函式呼叫 那只是編譯器自己的優化inline 沒有成功與否啊 它只是用來提供資訊的關鍵字而已對了 GNU 的 inline 效果和 srandard 不一樣但是兩者對 inline 的定義卻是相同的兩個都拿來看看應該可以找出 inline 的本質
作者: lantw44 (#######################)   2016-06-16 14:30:00
C 和 C++ 的 inline 規則不太一樣,可以分開討論
作者: wtchen (沒有存在感的人)   2016-06-16 15:41:00
是喔?有人可以補充一下C++的inline嗎?我只知道一個大家都說別用的inline namespace....
作者: Caesar08 (Caesar)   2016-06-16 15:46:00
怎麼會?inline namespace很有用阿
作者: wtchen (沒有存在感的人)   2016-06-16 16:32:00
Google C++ Style就建議不要用....
作者: Caesar08 (Caesar)   2016-06-16 22:17:00
好吧,那就聽google的吧不過我比較想知道原因就是了
作者: lantw44 (#######################)   2016-06-16 23:13:00
在 C 如果只有使用 inline 而沒有加 static 或 externinline 被接受時就可正常使用,外部不可 externinline 被拒絕時會造成 undefined reference error若要避免錯誤發生要在其中一個 .c 用 extern inline 宣告這樣那個 .c 的版本就會在 inline 失敗的時候被使用

Links booklink

Contact Us: admin [ a t ] ucptt.com