C中静态功能的目的

时间:2013-12-05 20:45:23

标签: c function static

我知道静态函数的名称只在声明它的文件(翻译单元)中可见。这使得封装成为可能。

但是静态函数通常在源文件中声明,因为如果你在头文件中执行它,你最终可能会有多个它的实现(我认为这不是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何时有用?

3 个答案:

答案 0 :(得分:5)

static表示该函数具有内部链接。这意味着它不会与其他文件(翻译单元)中相同标识符的其他用途链接。

例如,假设在Tree.c中我有一个对树结构进行操作的函数,并且我有一些名为UpdateNode的本地子例程,它在树的一部分上运行。进一步假设在List.c中,我有一个对List结构进行操作的函数,它还有一个名为UpdateNode的本地子例程,它只适用于List结构,而不适用于Tree结构。

如果我将这两个子程序都留有外部链接,那么链接器会抱怨多个定义。通过使用static的内部链接标记它们,可以避免这个问题。

答案 1 :(得分:0)

在以下情况下很有用:

  1. 该功能不应在翻译单元外显示。
  2. 该功能的可见性应视为“隐藏”(使用动态链接器时)。
  3. 让编译器警告未使用的功能。
  4. 内联简单函数,在这种情况下,标题中定义了静态函数。对于C99之前的代码,可以更好地替代宏。
  5. 或任何上述的组合。可能还有其他一些我没想到的事情。

答案 2 :(得分:0)

除了所有答案之外,我还要添加MISRA C关于静态关键字的内容。

  

规则8.8 static 存储类说明符应全部使用   具有内部链接的对象和函数的声明

     

标准声明如果声明了一个对象或函数    extern 存储类说明符和对象的另一个声明   或者函数已经可见,链接是指定的   早先的声明。这可能会令人困惑,因为它可能是   期望 extern 存储类说明符创建外部   连锁。因此,静态存储类说明符应该是   始终如一地应用于具有内部联系的对象和功能。

这一个

  

规则8.10 内联函数应使用静态存储类

声明      

如果使用外部链接声明内联函数但不是   在同一翻译单元中定义,行为未定义。

换句话说,尽可能使用static关键字