在 Objective-c++ 中,有没有办法将静态 c 函数移动到另一个文件?

In Objective-c++, is there a way to move static c functions to another file?

在工作中,我看到许多 ObjC++ 文件的顶部有许多静态 C 辅助函数。我想将这些静态 C 辅助函数分解成一个单独的文件,然后只导入 header 以提高可读性。

而不是:

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

类似于:

#import "MyClassHelpers.h"

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

谢谢!

在 C 中,将 static 放在函数上意味着该函数被限制在声明它的文件中。 (因此,您可以在多个文件中使用相同名称的 static 函数而不会发生冲突,而如果没有 static,link 用户可能会抱怨多个具有相同名称的函数。)在某种程度上,您可以将其视为使文件“私有”函数(在您可能熟悉的 object-oriented 语言中 class 的私有成员的意义上)。

如果你想定义一个函数的代码一次并在多个文件中使用它,你想要相反的方式——让它成为 not static,然后用 extern 在 header 中声明函数签名,像这样:

// 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 的其他文件可以使用此函数,link er 将 link 它与从 [=19= 编译的单个实现一起使用].

如果您像这样在 header 中放置了 static 函数定义:

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

然后每个包含此 header 的实现文件将有效地拥有其自己的此函数的“私有”副本,可能导致相同的代码被重复多次。 (包含一个 header 基本上与 copy-pasting 相同 header 的内容到它包含的文件中,所以如果你在每个文件中都写了这个静态函数定义。)

我突然想到,也许您尝试对这些小函数进行的操作是让对它们的调用成为 内联,而不是作为单独的函数调用进行调用。在那种情况下,也许在 header 中声明它 staticinline 会起作用:

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