我知道静态函数的名称只在声明它的文件(翻译单元)中可见。这使得封装成为可能。
但是静态函数通常在源文件中声明,因为如果你在头文件中执行它,你最终可能会有多个它的实现(我认为这不是static
的意图)。
示例:
的 main.c中 的
#include "functions.h"
int main()
{
FunctionA();
FunctionB(); // Can't call regardless of "static".
return 0;
}
的 functions.h 的
#ifndef FUNCTIONS_H
#define FUNCTIONS_H
void FunctionA();
#endif /* FUNCTIONS_H */
的 functions.c 的
#include "functions.h"
#include <stdio.h>
static void FunctionB(); // Same whether "static" is used or not.
void FunctionA()
{
printf("A");
}
void FunctionB()
{
printf("B");
}
那么static
何时有用?
答案 0 :(得分:5)
static
表示该函数具有内部链接。这意味着它不会与其他文件(翻译单元)中相同标识符的其他用途链接。
例如,假设在Tree.c
中我有一个对树结构进行操作的函数,并且我有一些名为UpdateNode
的本地子例程,它在树的一部分上运行。进一步假设在List.c
中,我有一个对List结构进行操作的函数,它还有一个名为UpdateNode
的本地子例程,它只适用于List结构,而不适用于Tree结构。
如果我将这两个子程序都留有外部链接,那么链接器会抱怨多个定义。通过使用static
的内部链接标记它们,可以避免这个问题。
答案 1 :(得分:0)
在以下情况下很有用:
或任何上述的组合。可能还有其他一些我没想到的事情。
答案 2 :(得分:0)
除了所有答案之外,我还要添加MISRA C关于静态关键字的内容。
规则8.8 static 存储类说明符应全部使用 具有内部链接的对象和函数的声明
标准声明如果声明了一个对象或函数 extern 存储类说明符和对象的另一个声明 或者函数已经可见,链接是指定的 早先的声明。这可能会令人困惑,因为它可能是 期望 extern 存储类说明符创建外部 连锁。因此,静态存储类说明符应该是 始终如一地应用于具有内部联系的对象和功能。
这一个
规则8.10 内联函数应使用静态存储类
声明如果使用外部链接声明内联函数但不是 在同一翻译单元中定义,行为未定义。
换句话说,尽可能使用static
关键字