### C语言关键字浅析系列 ###
### ISO/ANSI C 关键字 ###
extern的本意是external,是C语言5个存储类中
外部存储类(external storage class)的简写,这个类型的特征是一种具有外部链接的静态变量,
且具有文件作用域、外部链接和静态存储时期
该类型的变量又称为外部变量(external variable)
extern的作用是:
作为外部存储类的标志,定义或声明外部变量。
1、外部变量的使用
其实外部变量更为常见的一个称呼可能是全局变量
即便我们不是每次要写一个全局变量的时候都刻意地加上了extern这顶帽子,就像auto一样
但有些时候extern有更能表现自己存在的意义的地方
比如下面这个demo.c文件:
#include <stdio.h>
/*
本文件中定义的外部变量和数组
注意此处是在“定义”外部变量
*/
int maxTemp;
float temp[31];
/*
另一个文件中定义的外部变量,本文件需要用
注意此处extern的作用是“声明”外部变量,该声明必须有extern
*/
extern int maxHumi;
void fun(void);
int main(void)
{
extern int maxTemp; /* 可选声明,表示该函数要用这个变量,extern可省略,但可作为一种标记 */
extern float temp[]; /* 可选声明,但此处无需再指定数组长度,因为不是定义 */
/*
extern int minTemp;
如果要使用本文件中函数本身不在其作用域的外部变量,可以声明后使用,此外部变量作用域将从声明处开始
*/
}
int minTemp; /* 该外部变量没有在文件头部定义,故该外部变量的作用域是此处到文件末尾,即main函数不可见该变量 */
void fun(void)
{
/* 如果此函数中不写extern声明,其实也可以使用可见的外部变量 */
}
2、作用域注意
如果需要在每个函数中用extern声明需要使用哪些外部变量,就一定要记住在声明处写上extern
否则就会出现以下情况:
int max; /* 定义一个外部变量 */
int main(void)
{
int max; /* 没有extern作外部变量声明,这是在定义一个自动变量max,在代码块内将覆盖掉外部max */
}
也许“每个函数中声明一遍该函数需要使用的外部变量”这一做法看上去很多余,
但extern在引用其他文件中定义的变量时,可以起到一种借口的作用,
在大型软件开发中更规范的编写习惯可能会带来更好更安全的效果
然而在大量引用其他文件的情况下,外部变量本身在维护上也要多费点心思
如果现在有一个文件中有一个外部变量,其在其他好几个文件中都需要使用,
但我们知道,无论它被哪个函数引用和赋值,它的每次修改后的值在所有引用的地方都是同步变化的
这其中就存在一些风险
3、初始化
和静态变量类似,如果不对外部变量进行显示初始化(如以上demo),那么这个外部变量将被自动赋值0
如果是数组变量则会生成全0数组
与自动变量不同的是,外部变量的初始化只能用常量表达式:
int max = 1; /* 常量赋值 */
double min = 3.0 * 2.1; /* 常量表达式赋值 */
size_t L = sizeof(int); /* 类型不能是变长数组,反之sizeof表达式是常量表达式 */
int min = max - 1; /* 不合法的变量表达式赋值 */
——参考《C Primer Plus第五版》
相关文章:
C语言关键字浅析-static
C语言关键字浅析-register
C语言关键字浅析-typedef