在 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 }
那么每个包含这个头文件的实现文件都会有效地拥有它自己的这个函数的“私有”副本,这可能会导致相同的代码被重复多次。 (包含标头基本上与将标头的内容复制粘贴到包含它的文件中相同,因此如果您在每个文件中都编写了此静态函数定义。)
我突然想到,也许您试图对这些小函数做的就是将它们的调用内联,而不是作为单独的函数调用来调用。在这种情况下,也许在标题中声明 static 和 inline 会起作用:
// in MyClassHelpers.h
static inline int _AddEm(const int a, const int b) { return a + b }