内联函数与宏

时间:2012-09-13 22:29:49

标签: objective-c ios c macros inline

我正在使用C和Objective-C开发iOS应用程序,我想编写一小段代码,这些代码将在多个地方执行数千次。将它设为inline函数并确保它将始终被扩展(我将永远不会获取其地址)或者我应该将其设为宏是否安全?代码很小,而且会很频繁地执行,所以我想确保我最终不会有成千上万的函数调用,但是如果可能的话,我仍然希望函数方法的类型安全。 ..

3 个答案:

答案 0 :(得分:4)

如果要确保函数内联,请将其设置为“extern inline”(这是GNU-C功能)。这些功能仅用于内联;编译器永远不会为它生成“真实”函数。因此,如果内联失败,您应该收到链接器错误。我认为clang已经“继承”了这个功能。

通常,如果可能,请始终使用内联而不是宏。有许多C编译器长期使用它的原因,C ++最终将其作为核心功能添加;它使得使用起来更安全可靠。还有一些东西需要宏,但这些东西很少而且很远。

答案 1 :(得分:2)

是的,您应该在宏上使用内联函数。

性能与宏相同(毕竟代码是内联的),你也可以获得类型安全性。

N.B。,这假设您的函数足够简单,编译器可以内联。如果不是这样,gcc的-Winline选项会发出警告;不确定平台上的标志是什么。

另请参阅this post了解您可能更喜欢宏的情况(例如,延期评估) - 但根据您的问题,听起来像内联函数是明智的选择。

答案 2 :(得分:0)

我可能错了,但我理解编译器只能内联同一源文件中的函数。如果您的内联函数位于文件A中并且您尝试在其他地方使用它,则无法内联,除非 链接器进行链接时优化。

这是因为编译器一次只将一个C文件编译成一个目标文件。它不能从另一个目标文件中获取内联函数,因为首先它可能尚未编译,其次,它不知道要查找哪个目标文件。