【问题标题】:In Objective-c++, is there a way to move static c functions to another file?在 Objective-c++ 中,有没有办法将静态 c 函数移动到另一个文件?
【发布时间】:2021-02-03 17:20:55
【问题描述】:

在工作中,我看到很多 ObjC++ 文件在顶部有几十个静态 C 帮助函数。我想将这些静态 C 辅助函数分解为一个单独的文件,然后只导入标头以简化可读性。

代替:

static int _AddEm(const int a, const int b) { return a + b }
...
...
...
x 300

类似:

#import "MyClassHelpers.h"

这将包含所有静态 C 辅助函数。问题是 static 似乎只在声明的文件中有效(我来自 Swift 和 Java 背景),所以我不能只在 c++ 世界中声明一个静态类并把它和它的助手一起带过来。我想保持使用静态的速度和二进制大小的好处。这方面的最佳做法是什么?

谢谢!

【问题讨论】:

    标签: objective-c++


    【解决方案1】:

    在 C 中,将static 放在函数上意味着该函数仅限于声明它的文件。 (因此,您可以在多个文件中拥有具有相同名称的 static 函数而不会发生冲突,而没有 static 的链接器可能会抱怨具有相同名称的多个函数。)在某种程度上,您可以将其视为使函数对文件“私有”(在您可能熟悉的面向对象语言中的类的私有成员的意义上)。

    如果你想定义一个函数的代码一次并在多个文件中使用它,你要相反——把它设为notstatic,然后在头部声明函数签名用extern,像这样:

    // in MyClassHelpers.h
    extern int _AddEm(const int a, const int b);
    
    // in MyClassHelpers.c
    int _AddEm(const int a, const int b) { return a + b }
    

    这样,包含MyClassHelpers.h 的其他文件可以使用该函数,链接器会将它与从MyClassHelpers.c 编译的单个实现链接。

    如果您在标题中放置了 static 函数定义,如下所示:

    // in MyClassHelpers.h
    static int _AddEm(const int a, const int b) { return a + b }
    

    那么每个包含这个头文件的实现文件都会有效地拥有它自己的这个函数的“私有”副本,这可能会导致相同的代码被重复多次。 (包含标头基本上与将标头的内容复制粘贴到包含它的文件中相同,因此如果您在每个文件中都编写了此静态函数定义。)

    我突然想到,也许您试图对这些小函数做的就是将它们的调用内联,而不是作为单独的函数调用来调用。在这种情况下,也许在标题中声明 staticinline 会起作用:

    // in MyClassHelpers.h
    static inline int _AddEm(const int a, const int b) { return a + b }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      • 1970-01-01
      • 2011-03-17
      • 2011-09-25
      • 2014-05-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多