首页 > 解决方案 > 将函数声明为静态和不将其包含在标头中有什么区别?

问题描述

以下场景有什么区别?

// some_file.c
#include "some_file.h" // doesn't declare some_func

int some_func(int i) {
    return i * 5;
}
// ...

// some_file.c
#include "some_file.h" // doesn't declare some_func

static int some_func(int i) {
    return i * 5;
}
// ...

如果static对函数所做的一切都是限制它们对其文件的可访问性,那么这两种情况是否都意味着some_func(int i)只能从中访问,some_file.c因为在这两种情况下都没有some_func(int i)放在头文件中?

标签: cstaticheader-files

解决方案


静态函数对于声明它的 .c 文件是“本地的”。因此,您可以在另一个 .c 文件中拥有另一个函数(静态或非),而不会发生名称冲突。

如果 .c 文件中有一个未在任何头文件中声明的非静态函数,则不能从另一个 .c 文件调用此函数,但也不能在另一个 .c 文件中有另一个同名函数,因为这会导致名称冲突。

结论:所有纯本地函数(仅在 .c 函数内部使用的函数,例如本地辅助函数)都应声明为静态,以防止命名空间的污染。

正确用法示例:

文件1.c

static void LocalHelper()
{
}
...

文件2.c

static void LocalHelper()
{
}
...

半正确用法示例

文件1.c

static LocalHelper()   // function is local to file1.c
{
}
...

文件2.c

void LocalHelper()     // global functio
{
}
...

文件3.c

void Foo()
{
   LocalHelper();    // will call LocalHelper from file2.c
}
...

在这种情况下,程序将正确链接,即使LocalHelper在 file2.c 中应该是静态的

错误使用示例

文件1.c

LocalHelper()          // global function
{
}
...

文件2.c

void LocalHelper()     // global function
{
}
...

文件3.c

void Foo()
{
   LocalHelper();       // which LocalHelper should be called?
}
...

在最后一种情况下,我们有一个 nema collition,程序甚至不会链接。


推荐阅读