C语言关键字浅析-extern

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Johan_Joe_King/article/details/83993157

### 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语言关键字浅析-auto

C语言关键字浅析-static

C语言关键字浅析-register

C语言关键字浅析-typedef

猜你喜欢

转载自blog.csdn.net/Johan_Joe_King/article/details/83993157