2011-04-12 77 views
2

一个全局变量可能一个在C两个不同的存储类,以我所知,并声明可以用两种不同的关键字,correspodingly给出extern声明和定义用C

extern int foo; //default 
static int bar; 

静态变量只在声明的模块内可见,并且不能导出。在extern声明的情况下,变量位于链接的所有模块的公共名称空间中,除非被静态变量遮蔽。

鉴于静态变量必须在其模块中定义,可以在其他地方定义一个外部变量。必须定义它是否曾经使用过。

我的编译器(GCC)接受

static int bar = 5; 

但在投下

extern int foo = 4; 

这似乎可以预期的extern变量从未使用关键字 '的extern' 定义的抱怨。这导致以下问题问题

上述示例中的Object'foo'在定义它的模块中具有哪种存储类?

+3

什么是投诉?我怀疑它抱怨它被多次定义。 – Skurmedel 2011-04-12 11:38:02

+4

“extern”实际上是“其他人已经定义了这个” - 所以在extern声明中尝试赋值时没有任何意义。你只需做“int foo = 4;”在*一个* C文件中,你很好。 – Erik 2011-04-12 11:40:53

+1

你不能设置extern的值,你不拥有它的实例化模块,它声明它通常是 – forsvarir 2011-04-12 11:40:57

回答

0

的外部变量将与在装置中的全局范围(出口),其中它被定义来定义:

INT巴兹= 5;

+0

现在,baz是一个静态变量还是一个外部变量?如果两者都不,那么它是什么? – shuhalo 2011-04-19 10:49:22

+0

在它被定义的文件中是一个静态变量。在其他复杂单位中,这是一个外部。 不要与使用“static”关键字混淆,该关键字虽然将变量定义为静态,但也将其范围限制为本地编译单元。 “ – gby 2011-04-19 19:29:17

0

默认存储类别为auto

2

IIRC,extern更多的暗示编译器不需要为该值分配存储空间。预计链接器将在另一个编译单元中查找该值。通常在头文件中使用extern来指示某人定义了与该名称关联的存储。该值的定义不包括extern关键字,因为编译器必须为编译单元中包含该定义的值分配存储空间。

查看extern storage class specifier了解更多详情。

0

其实你错过了两个存储类:自动和注册
注册并不重要,但默认存储类是auto。
自动为内存中的某个变量预留空间(这通常是您声明变量时所需的)。应该注意的是,对于'自动变量',每次输入变量的范围时都会分配新的空间。 (即当func()声明一个'auto'变量时,从func()内部调用函数func()将会产生两个不同的变量,每次调用func()时只会知道它自己的变量
由此可知,在全局范围声明的自动变量将是唯一的(因为范围只能被输入一次)
然而,静态变量总是唯一的,唯一的意义是空间只能被分配一次,当func()调用func ()和你想同时函数调用对同一变量进行操作。
的extern变量只是唯一变量的引用。
当你要访问一个不同的文件中声明的全局变量可以使用这些。
鉴于文件1.c和2。c不足以声明“int global;”在这两个文件中,因为空间将被分配两次,名称冲突会导致链接错误。
因此,您所做的是在一个文件中保留空间(使用“int global;”),并在另一个文件中告诉链接器通过编写“extern int global;在另一个文件中查找名称”global“的变量。 ”。