2011-01-25 223 views
8

可能重复:
Difference between 'global' and 'static global'static int a和int a有什么区别?

是什么语句1和2之间的区别: -

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

static int a; // 1. 
int b;  // 2. 

感谢您的帮助。

+0

许多重复,例如, ['全球'和'静态全球'之间的差异](http://stackoverflow.com/questions/959889/difference-between-global-and-static-global) – 2011-01-25 10:12:04

+0

除了给出的所有答案,值得一提的是,所有静态变量,无论它们在哪里分配,以及所有全局变量(如上面的“b”)都受到“静态初始化”的约束。这意味着它们必须在程序启动前由程序初始化。因此,你可以通过它们被初始化的标准来保证。如果你没有明确地初始化它们,它们被隐含地初始化为零(或者指针为NULL)。这使得它们与本地范围变量不同。 – Lundin 2011-01-25 10:56:22

回答

5

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

6

两者都是变量定义,然而,在“全局声明区域”中,施加到一个可变的static关键字限制了全局变量来仅在它被定义的翻译单元看到。

+7

换句话说,如果它在`foo.c`文件中,那么即使你'extern`,bar.c也不能访问它。 – EboMike 2011-01-25 10:01:01

+0

@EboMike +1,谢谢你的进一步澄清 – SiegeX 2011-01-25 10:06:50

2

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

+0

要迂腐,如果你在一个头文件中定义`static int a`,它将不能在该文件中访问“; – 2011-01-25 10:02:33

1

静态变量的寿命延长了整个程序的生命周期。但是,范围规则仍然适用。

如果您在方法之外定义静态变量(通常在类的开始处),您的变量将在该类中的任何位置可用。

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

1
static int a; 
int b; 

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

C99 6.2.2

6.2.2 identi音响ERS的连杆机构

  • 1)一种identi音响ER在不同的范围中声明或在同一范围内不止一次可以是 作出指代相同的对象或函数通过一个称为链接的进程。有 三种联系:外部,内部和无。2)在构成整个程序的翻译单元和库的集合中,每个 声明一个特定的具有外部链接的标识符表示相同的对象或者 函数。在一个翻译单元内,每个与内部 连接的标识符声明表示相同的对象或功能。每个没有 连接的标识符声明表示一个独特的实体。

  • 3)如果一个文件范围identi音响ER为一个对象或一个函数的声明包含存储 - 类SPECI音响ER静态的,identi音响破乳剂具有内部连接

相关问题