C中的外部声明和定义

时间:2011-04-12 11:36:40

标签: c scope storage-class-specifier

一个全局变量可能在C中有一到两个不同的存储类,据我所知,声明可以用两个不同的关键字给出,相应地

extern int foo; //default
static int bar;

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

虽然必须在其模块中定义静态变量,但可以在其他地方定义外部变量。如果曾经使用它必须定义。

我的编译器(GCC)接受

static int bar = 5;

但在

投诉
extern int foo = 4;

似乎预计外部变量永远不会使用关键字“extern”定义。这导致以下问题

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

4 个答案:

答案 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”的变量。