一个全局变量可能在C中有一到两个不同的存储类,据我所知,声明可以用两个不同的关键字给出,相应地
extern int foo; //default
static int bar;
静态变量仅在声明模块中可见,并且无法导出。在extern声明的情况下,变量位于链接的所有模块的公共名称空间中,除非被静态变量遮蔽。
虽然必须在其模块中定义静态变量,但可以在其他地方定义外部变量。如果曾经使用它必须定义。
我的编译器(GCC)接受
static int bar = 5;
但在
投诉extern int foo = 4;
似乎预计外部变量永远不会使用关键字“extern”定义。这导致以下问题:
上例中的Object'foo'在定义它的模块中有哪种存储类?
答案 0 :(得分:2)
IIRC,extern
更多的是对编译器的暗示,它不必为该值分配存储空间。期望链接器在另一个编译单元中找到该值。通常在头文件中使用extern
来表示某人已定义与该名称关联的存储。值的定义不包括extern
关键字,因为编译器必须为包含定义的编译单元中的值分配存储空间。
有关详细信息,请参阅extern storage class specifier。
答案 1 :(得分:0)
外部变量将在定义它的单元中使用全局范围(导出)定义:
int baz = 5;
答案 2 :(得分:0)
默认存储类为auto
。
答案 3 :(得分:0)
实际上你错过了两个存储类:auto和register
注册在这里无关紧要,但默认存储类是auto
自动为内存中的某个变量保留空间(通常是在声明变量时所需的空间)。应该注意的是,对于“自动变量”,每次输入变量的范围时都会分配新的空间。 (即当func()声明'auto'变量时,从func()中调用函数func()将导致两个不同的变量,每次调用func()只会知道它自己的变量。
由此可见,在全局范围内声明的自动变量将是唯一的(因为范围仅输入一次)
然而,静态变量始终是唯一的。在空间只分配一次的意义上是独一无二的。当func()调用func()并且您希望两个函数调用都对同一个变量进行操作时,这很有用
外部变量只是对唯一变量的引用
当您想要访问在不同文件中声明的全局变量时,可以使用这些
鉴于文件1.c和2.c,它不足以声明“int global;”在两个文件中,因为空间将被分配两次,名称冲突将导致链接错误
因此,您所做的是在一个文件中保留空间(使用“int global;”),在另一个文件中,通过编写“extern int global;”告诉链接器在另一个文件中查找名称“global”的变量。