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

可能重复:
‘全球’和’静态全球’之间的区别

语句1和2之间有什么区别: –

#include  //In the global declaration area static int a; // 1. int b; // 2. 

感谢帮助。

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

两者都是变量定义,但是,应用于“全局声明区域”中的变量的static关键字限制了全局变量仅在定义它的转换单元中看到。

它们都在程序的整个生命周期中。 声明为static的变量只在声明它的文件中具有作用域,因为可以使用extern声明从其他文件访问声明为static而不声明的变量。

原始来源 – http://bytes.com/topic/c/answers/860211-global-variable-static-global-variable

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

 static int a; int b; 

a有内部联系。 b有外部联系。

C99 6.2.2

6.2.2识别者的联系

  • 1)可以通过称为链接的过程使不同范围或相同范围内多次声明的标识符引用相同的对象或函数。 链接有三种:外部,内部和无。

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

  • 3)如果对象或函数的文件范围标识符的声明包含存储类指定静态,则标识符具有内部链接

静态变量的生命周期延伸到程序的生命周期。 但是,范围规则仍然适用。

如果在方法之外定义静态变量(通常在类的开头),则可以从该类中的任何位置获取变量。

您无法更改这些对象的值。 它们通常用于存储API密钥等内容。