2

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

4

3 回答 3

4

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

通常,如果可能,请始终使用内联而不是宏。许多 C 编译器多年来一直使用它是有原因的,C++ 最终将它添加为核心特性;它使使用起来更加安全可靠。仍然有需要宏的东西,但这些东西很少而且相差甚远。

于 2012-09-13T22:52:00.950 回答
2

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

性能将与宏相同(毕竟代码是内联的),并且您还将获得类型安全。

注意,这假设您的函数足够简单,编译器可以内联。-Winline如果不是这种情况,gcc 的选项会发出警告;不确定哪些标志在您的平台上做同样的事情。

如果您可能更喜欢宏(例如,延迟评估),另请参阅这篇文章- 但根据您的问题,听起来内联函数是明确的选择。

于 2012-09-13T22:44:49.767 回答
0

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

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

于 2012-09-13T23:03:10.887 回答