可能是重复问题:
global和static global之间的区别
语句1和语句2之间有什么不同:
#include <stdio.h>
//In the global declaration area
static int a; // 1.
int b; // 2.
感谢您的帮助。可能是重复问题:
global和static global之间的区别
语句1和语句2之间有什么不同:
#include <stdio.h>
//In the global declaration area
static int a; // 1.
int b; // 2.
感谢您的帮助。static
全局变量是本地的,只在它定义的翻译单元中可见。因此,如果你在两个不同的翻译单元中定义static int a;
,这将创建两个独立的变量。如果你在两个翻译单元中定义非静态全局变量int b;
,你将遇到链接器错误(但你可以在其中一个翻译单元中使用extern int b;
告诉链接器应该使用另一个翻译单元中的全局变量)。两者都是变量定义,但是在“全局声明区域”中应用static
关键字的变量只能在定义它的翻译单元中看到。
foo.c
中,那么即使你使用 extern
,bar.c
也无法访问它。 - EboMikestatic int a;
int b;
a
具有内部链接。 b
具有外部链接。
C99 6.2.2
6.2.2 标识符的链接
1) 在不同作用域或同一作用域中声明的标识符可以通过一个称为链接的过程使其引用相同的对象或函数。链接分为三种类型:外部链接、内部链接和无链接。
2) 在构成整个程序的翻译单元和库的集合中,具有外部链接的特定标识符的每个声明都表示相同的对象或函数。在一个翻译单元内,具有内部链接的标识符的每个声明都表示相同的对象或函数。没有链接的标识符的每个声明表示唯一实体。
3) 如果文件作用域标识符的声明为对象或函数包含存储类说明符static,则该标识符具有内部链接。
static int a
只能在该文件中访问。int b
可以通过 extern int b
在不同的文件中访问。
static int a
,它是不会被“该文件内”所访问的 ;) - Victor Nicollet静态变量的生命周期跨越整个程序的运行时间。但是,作用域规则仍然适用。
如果您在方法之外定义静态变量(通常在类的开头),则该变量将在该类中的任何地方都可用。
您无法更改这些对象的值。它们通常用于存储诸如 API 密钥之类的东西。