static
,extern
和inline
(及其组合)在使用LLVM编译器的Objetive-C中意味着什么?
另外,我注意到有CG_EXTERN
和CG_INLINE
个宏。我们应该使用那些吗?
(我找不到一个有明确解释的来源,所以我觉得在这里创建一个可能很有用,或者如果有人知道那个就指向它)
答案 0 :(得分:33)
使用LLVM编译器,Objetive-C中静态,外部和内联(及其组合)的含义是什么?
与C中相同,除非您编译为ObjC ++ - 那么它们与C ++中的含义相同。
所以这里是C的介绍,但如果你准备好使用它们,请阅读链接,因为细节很重要:
<强>的extern 强>
摘要:表示标识符已在其他位置定义。
详细信息:http://tigcc.ticalc.org/doc/keywords.html#extern
<强>静态强>
摘要(值):保留变量值以在其范围结束后继续存在。
摘要(函数):有效地发出未命名的副本 - 对于C中的私有函数很有用,并且可以在与内联函数一起使用时用于转义多个定义错误。
详细信息:http://tigcc.ticalc.org/doc/keywords.html#static
<强>内联强>
摘要:建议将函数体转移到调用者中。
详细信息:http://tigcc.ticalc.org/doc/gnuexts.html#SEC93
请注意,内联和静态在C ++中要复杂得多(就像C ++中的所有内容一样)。
我还发现有CG_EXTERN和CG_INLINE宏。我们应该使用那些吗?
没有
相反,如果您需要此类功能,则应使用自己的含义指定自己的。 CG_EXTERN
和CG_INLINE
具有特定含义(可能会发生变化),并且可以在其定义的上下文中使用 - 此外,您不希望包含一小撮框架(全部CoreGraphics / ApplicationServices / CoreFoundation / etc。)当你想要以C和C ++的方式指定extern
时。{/ p>
答案 1 :(得分:5)
Justin涵盖了大部分内容,但我为那些想深入挖掘的人找到了一些其他不错的资源:
通过声明函数内联,您可以告诉编译器将该函数的完整代码直接替换为调用它的位置。这是一个相当高级的功能,需要了解低级编程。
This SO question对 extern 变量有很大的答案 - 变量定义为“其他地方” - 但也需要在“此处”使用。
静态可保留范围之外的变量生命。变量在声明的范围内可见。
What does a static variable mean?