在工作中,我看到许多objc++文件在顶部有几十个静态C辅助函数。我想把这些静态的C辅助函数分解成一个单独的文件,只导入头文件以提高可读性。
代替:
static int _AddEm(const int a, const int b) { return a + b }
...
...
...
x 300
类似:
#import "MyClassHelpers.h"
将包含所有静态C辅助函数。问题是静态似乎只在声明的文件中工作(我来自Swift和Java背景),所以我不能只是在c++世界中声明一个静态类,然后把它和它的助手带来。我希望保持使用静态的速度和二进制大小优势。对此的最佳实践是什么?
谢谢!
在C语言中,将static
放在函数上意味着该函数仅限于声明它的文件。(因此,您可以在多个文件中具有相同名称的static
函数而不会发生冲突,而没有static
,链接器可能会抱怨具有相同名称的多个函数。)在某种程度上,你可以把它看作是使函数"私有"。到文件(您可能熟悉的面向对象语言中类的私有成员)。
如果你想定义一个函数的代码一次并在多个文件中使用它,你想要相反的——让它而不是static
,然后在头文件中用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 }
则每个包含此头文件的实现文件将有效地拥有自己的"private";此函数的副本,可能导致相同的代码被重复多次。(包含头文件基本上等同于将头文件的内容复制粘贴到包含头文件的文件中,因此,如果您在每个文件中都编写了这个静态函数定义。)
我突然想到,也许你想用这些小函数做的是让对它们的调用内联,而不是作为单独的函数调用来调用。在这种情况下,也许在头文件中声明static
和inline
会起作用:
// in MyClassHelpers.h
static inline int _AddEm(const int a, const int b) { return a + b }