与静态内部变量一样,外部变量属于静态存储方式。
如果程序由多个源文件构成,根据某个源文件中定义的外部变量能否被其他源文件中的函数所引用,将外部变量分两种:
(1)静态外部变量——只允许被本源文件中的函数引用,其定义格式为:
static 数据类型 外部变量表;
(2)非静态外部变量——允许被其他源文件中的函数引用。定义时缺省static关键字的外部变量,即为非静态外部变量。其他源文件中的函数,引用非静态外部变量时,需要在引用函数所在的源文件中进行如下声明:
[extern] 数据类型 外部变量表; /*extern可以缺省*/
【例6.20】非静态外部变量示例:给定b的值,输入a和m,求a×b和am的值。
该程序由mainf.c和subf1.c两个源文件组成。
mainf.c文件的内容为:
subf1.c文件的内容为:(www.xing528.com)
程序运行情况如下:
在函数内的extern变量声明,表示引用本源文件中的外部变量,而函数外(通常在文件开头)的extern变量声明,表示引用其他源文件中的外部变量。例如,例6.20程序中subf1.c文件中对外部变量a的声明是在函数外部,表示a变量是在其他源文件中定义的变量。
另外,静态外部变量和非静态外部变量,在存储方式上并无不同,都是静态存储方式。两者的区别在于:非静态外部变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态外部变量在各个源文件中都是有效的。而静态外部变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其他源文件中不能引用它。
静态内部变量和静态外部变量同属静态存储方式,但两者区别较大:
(1)定义的位置不同。静态内部变量在函数内定义,静态外部变量在函数外定义。
(2)作用域不同。静态内部变量属于内部变量,其作用域仅限于定义它的函数内;虽然生存期为整个源程序,但其他函数是不能引用它的。
静态外部变量在函数外定义,其作用域为定义它的源文件内;生存期为整个源程序,但其他源文件中的函数也是不能使用它的。
(3)初始化处理不同。静态内部变量,仅在第1次调用它所在的函数时被初始化,当再次调用定义它的函数时,不再初始化,而是保留上一次调用结束时的值。而静态外部变量是在函数外定义的,不存在静态内部变量的“重复”初始化问题,其当前值由最近一次给它赋值的操作决定。
注意:把内部变量改变为静态内部变量后,改变了它的存储方式,即改变了它的生存期。把外部变量改变为静态外部变量后,改变了它的作用域,限制了它的使用范围。因此,关键字“static”在不同的地方所起的作用是不同的。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。