C:为什么静态变量不能像全局变量那样在外部链接

时间:2018-05-18 18:10:23

标签: c

固件和编译器的观点,为什么静态变量不能像全局变量那样在外部链接。

1 个答案:

答案 0 :(得分:1)

static关键字在这里提供双重职责。它指定对象具有静态存储持续时间 - 即,在程序启动时分配对象的存储,并在程序退出时释放。

它还指定该对象的标识符具有内部链接。 IOW,标识符不会导出到链接器(它实际上是“私有”到该转换单元)。

Chapter and verse

6.2.2标识符的链接

1在不同范围或同一范围内多次声明的标识符可以是 通过名为 linkage 的进程来引用相同的对象或函数 29)有 三种联动:外部,内部和无。

2在构成整个程序的翻译单元和库集中 使用外部链接声明特定标识符表示相同的对象或 功能。在一个翻译单元内,每个内部的标识符声明 链接表示相同的对象或功能。标识符的每个声明都带有 no 联系表示一个独特的实体。

3如果对象或函数的文件范围标识符的声明包含存储类 说明符 static ,标识符具有内部链接。 30) 29)不同标识符之间没有联系 30)函数声明只有在文件范围内时才能包含存储类说明符 static ;看到 6.7.1。功能

如果您希望某个对象具有静态存储持续时间,但其标识符对其他翻译单元可见,则必须在文件范围中声明它而不使用 static关键字:

#include <stdio.h>

int i_am_static_and_visible;
static int i_am_static_but_not_visible;

void foo( void )
{
  static int i_am_static_but_not_visible_either;
  ...
}