固件和编译器的观点,为什么静态变量不能像全局变量那样在外部链接。
答案 0 :(得分:1)
static
关键字在这里提供双重职责。它指定对象具有静态存储持续时间 - 即,在程序启动时分配对象的存储,并在程序退出时释放。
它还指定该对象的标识符具有内部链接。 IOW,标识符不会导出到链接器(它实际上是“私有”到该转换单元)。
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;
...
}