在 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 中声明它 static
和 inline
会起作用:
// in MyClassHelpers.h
static inline int _AddEm(const int a, const int b) { return a + b }
在工作中,我看到许多 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 中声明它 static
和 inline
会起作用:
// in MyClassHelpers.h
static inline int _AddEm(const int a, const int b) { return a + b }