C extern声明

来自泡泡学习笔记
跳到导航 跳到搜索

外部声明extern用于引用全局变量,该全局变量的主声明在其他地方——在同一模块中,或在另一个编译模块中。它是这样的:

extern basetype decorated-variable;


它的含义是,在当前作用域中,变量名指的是该名称的文件作用域变量——它需要在其他地方以非外部、非静态的方式声明。


例如,如果一个编译模块有这个全局变量声明

int error_count = 0;


然后其他编译模块可以指定它

extern int error_count;

允许引用同一变量。


通常编写外部声明的位置是在源文件的顶层,但是您可以在块中编写外部声明,以便在该块中访问全局或静态文件作用域变量。


由于extern声明不为变量分配空间,因此可以省略数组的大小:

extern int array[];

可以在自动转换为指针的所有上下文中正常使用array。然而,使用它作为sizeof的操作数是错误的,因为它的大小是未知的。


对于相同的变量,即使在相同的作用域中,如果它们给出相同的类型,那么对它们进行多个外部声明也是有效的。他们并不冲突——他们是一致的。对于数组,某些外部声明可以指定大小,而其他外部声明可以省略它,这是合法的。但是,如果两个声明给出不同的大小,则会产生错误。

同样,您可以在文件作用域中使用外部声明(参见文件作用域变量),然后对同一变量进行普通的全局(非静态)声明。它们并不冲突,因为它们对变量的相同含义说了兼容的东西。