[问题] 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