“static int a”和“int a”有什么区别?

14

可能是重复问题:
global和static global之间的区别

语句1和语句2之间有什么不同:

#include <stdio.h>
//In the global declaration area 

static int a; // 1.
int b;        // 2.
感谢您的帮助。

许多重复,例如 ‘全局’ 和 ‘静态全局’ 的区别 - Paul R
除了所有给出的答案之外,值得一提的是,所有静态变量无论在哪里分配,以及所有全局变量(如上面的“b”),都受到“静态初始化”的影响。这意味着它们必须在程序启动之前由程序进行初始化。因此,您可以通过标准保证它们已经被初始化。如果您没有显式地初始化它们,则它们会隐式地初始化为零(或指针的NULL)。这使它们与本地作用域变量不同。 - Lundin
6个回答

9
一个 static 全局变量是本地的,只在它定义的翻译单元中可见。因此,如果你在两个不同的翻译单元中定义static int a;,这将创建两个独立的变量。如果你在两个翻译单元中定义非静态全局变量int b;,你将遇到链接器错误(但你可以在其中一个翻译单元中使用extern int b;告诉链接器应该使用另一个翻译单元中的全局变量)。

7

两者都是变量定义,但是在“全局声明区域”中应用static关键字的变量只能在定义它的翻译单元中看到。


8
换句话说,如果它在文件 foo.c 中,那么即使你使用 externbar.c 也无法访问它。 - EboMike
@EboMike +1,感谢您进一步的澄清。 - SiegeX

4

1
这个答案是提供的最完整的一个。 - Lundin

2
static int a; 
int b; 

a具有内部链接。 b具有外部链接。

C99 6.2.2

6.2.2 标识符的链接

  • 1) 在不同作用域或同一作用域中声明的标识符可以通过一个称为链接的过程使其引用相同的对象或函数。链接分为三种类型:外部链接、内部链接和无链接。

  • 2) 在构成整个程序的翻译单元和库的集合中,具有外部链接的特定标识符的每个声明都表示相同的对象或函数。在一个翻译单元内,具有内部链接的标识符的每个声明都表示相同的对象或函数。没有链接的标识符的每个声明表示唯一实体。

  • 3) 如果文件作用域标识符的声明为对象或函数包含存储类说明符static,则该标识符具有内部链接


你假设它们都在文件作用域分配。如果它们是在本地分配的,你的陈述就不正确了。静态变量仍然具有内部链接,但非静态变量将被分配为“自动”链接,即在堆栈或CPU寄存器中。 - Lundin
@Lundin: "你假设它们都在文件作用域分配"再看一遍问题。 - Prasoon Saurav

2

static int a 只能在该文件中访问。int b 可以通过 extern int b 在不同的文件中访问。


说实话,如果你在头文件中定义了 static int a,它是不会被“该文件内”所访问的 ;) - Victor Nicollet

1

静态变量的生命周期跨越整个程序的运行时间。但是,作用域规则仍然适用。

如果您在方法之外定义静态变量(通常在类的开头),则该变量将在该类中的任何地方都可用。

您无法更改这些对象的值。它们通常用于存储诸如 API 密钥之类的东西。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接