代码之家  ›  专栏  ›  技术社区  ›  schmittsfn

如何在Objective-C中编写“global”内联函数(使用C语法)

  •  5
  • schmittsfn  · 技术社区  · 11 年前

    假设我在预编译头中包含一个头文件,其中包含一组内联函数,这些函数将在项目的任何TU中的任何需要的地方用作助手——那么写这些内联的正确方法是什么?

    1) 作为静态内联?例如。:

    static inline BOOL doSomethingWith(Foo *bar)
    {
       // ...
    }
    

    2) 作为外部内联?例如。:

    在Shared.h中

    extern inline BOOL doSomethingWith(Foo *bar);
    

    在Shared.m中

    inline BOOL doSomethingWith(Foo *bar)
    {
       // ...
    }
    

    我使用内联的目的是:

    • 通过封装通用指令,使代码不那么冗长
    • 集中它们所包含的代码以帮助将来的维护
    • 为了类型安全起见,使用它们而不是宏
    • 能够有返回值

    到目前为止,我只在野外看到过变体1)。 我读到(遗憾的是再也找不到了)变体1)并没有准确地将内联函数的主体移动到调用者中,而是创建了一个新函数,这只是 extern inline 确保了这种行为。

    2 回复  |  直到 11 年前
        1
  •  7
  •   CRD    11 年前

    由于给出的原因,跳过是否应该内联,在Cocoa中内联的标准方法是使用预定义的宏 NS_INLINE -在使用函数的源文件中或在导入的标头中使用它。因此,您的示例变成:

    NS_INLINE BOOL doSomethingWith(Foo *bar)
    

    对于GCC/Clang,宏使用 static 以及 always_inline 属性

    大多数(也许所有)编译器都不会内联 extern inline 因为它们一次只在一个编译单元上操作——一个源文件及其所有包含。

        2
  •  5
  •   user529758 user529758    11 年前

    通过封装通用指令,使代码不那么冗长

    非内联函数也能做到这一点。。。

    集中它们所包含的代码以帮助将来的维护

    那么你应该有非- inline 函数,你不觉得吗?

    为了类型安全起见,使用它们而不是宏

    能够有返回值

    我觉得这些还可以。


    嗯,当我写作的时候 内联 函数,我通常会制作 static -通常就是这样做的。(否则,如果你不够小心,你可能会得到各种神秘的链接器错误。)重要的是要注意 内联 影响函数的可见性,因此如果要在多个文件中使用它,则需要 静止的 修改器。

    extern inline 函数没有多大意义。如果您只有一个函数的实现,那么就无法实现内联的目的。如果使用链接时间优化(其中跨文件内联由链接器完成),则 内联 暗示 对于编译器 无论如何都不是很有用。

    只有外部内联才能确保这种行为。

    它根本不能“确保”任何事情。没有可移植的方法来强制内联——事实上,大多数现代编译器完全忽略关键字,而是使用启发式方法来决定何时内联。在GNU C中,您 可以 使用强制内联 __attribute__((always_inline)) 属性,但除非你有很好的理由,否则你不应该这么做。