这个问题已经在这里有一个答案:
- 用C静态函数 6个回答
- 当摆在头文件中的静态函数定义在C 2 6个回答
我知道,静态函数的名字只在其中它声明的文件(翻译单元)是可见的。 这使得封装成为可能。
但静态函数在源文件中常常声明,因为如果你在头文件中做到这一点,你可以用它的多种实现(我认为这是没有的意图最终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
有用吗?
static
说,功能有内在联系。 这意味着它不会与其他文件(编译单元)相同标识符的其他用途相联系。
例如,假设在Tree.c
我有对树结构进行动作的功能,和我有一些本地子程序称为UpdateNode
,关于树的一部分工作。 进一步假设在List.c
,我有一个名单上的运行结构的函数,并且它也有一些所谓的本地子程序UpdateNode
这还只是针对目录结构,而不是树形结构。
如果我离开了这两个子程序具有外部链接的,链接器会抱怨多重定义。 通过与具有内部链接的标志他们static
,就可以避免这个问题。
这是当有用:
- 该函数不应该是翻译单元外部可见。
- 该函数的能见度应被视为“隐藏”(当使用动态连接器)。
- 有编译器警告未使用的功能。
- 有微不足道的功能被内联,在这种情况下静态函数定义在头文件。 一个更好的选择,以宏C99预代码。
或任何以上的组合。 有可能是别的东西,我并没有马上想到。
在附加到所有的答案我想补充什么MISRA C说,关于static关键字。
规则8.8 静态存储类型应以具有内部链接的对象和函数的所有声明中使用
该标准规定,如果一个对象或功能与外部存储方式类说明和对象或函数的另一个声明中表示已经可见,联动是由早期的声明中指定。 这可能是混乱,因为它可能会被预期的extern存储类说明创建外部链接。 静态存储类说明因此应该一致地应用于对象和功能具有内部链接。
还有这个
8.10条内联函数应与静态存储类声明
如果一个内联函数声明为有外部链接,但在相同的翻译单元没有定义,该行为是不确定的。
换句话说,使用static
关键字无论它是可能的