全局变量及其生命周期详解

  • Post author:
  • Post category:其他

一、全局变量存储类别

全局变量存放在静态存储区中。因此他们的生存周期是固定的,存在于程序的整个运行过程中。全局变量的作用范围,一般是从定义位置开始到本程序文件的末尾。在此作用域内,全局变量可以为程序中各个函数所引用。

二、在一个文件内扩展外部变量(全局变量)的作用域

如果外部变量不在文件的开的头定义,其有效的作用范围只限定于定义处到文件结束。在定义之前的函数不能引用该外部变量。但是,若想在定义之前引用该外部变量(全局变量),则应该在引用前用关键字extern对该变量作“外部变量声明”。
为什么是外部变量声明,因为一般而言定义的全局变量是具有外部连接性的,也就是在同一个文件下,在另一个程序中定义的全局变量可以在另一程序中使用,但是需要用extern做声明,告诉编译器,该变量已经在某一个地方定义过了,不需要再定义。,而其他文件定义的全局变量,对于本文件相当于外部变量

#include<iostream>
using namespace std;
int main()
{
	extern int a;//将全局变量a=100的作用域扩展到此位置;
	cout << a << endl;
	return 0;
}
int a = 100;//全局变量

三、将外部变量的作用域扩展到其他文件

一个程序可能有多个源文件组成,那么一个文件想引用另一个文件中定义的外部变量(全局变量),该如何做?如果一个程序包含两个文件,两个文件都需要用到同一个外部变量Num,不能分别在两个文件中定义一个外部变量Num,否则在进行程序链接时会出现“重复定义”错误。正确的做法是在任意一个文件中定义Num,在另个文件中用extern对Num进行外部声明

/*文件1*/
#include<iostream>
using namespace std;
int Num = 100;//定义全局变量
int main()
{
	cout << Num << endl;
	return 0;
}
/*文件2*/
#include<iostream>
using namespace std;
//int Num = 50;//重复定义!!
extern int Num;//正确做法;
void display()
{
	cout << Num << endl;
}

注意:(外部变量)全局变量才具有外部连接性,而局部变量不具有外部链接性!

/*文件1*/
#include<iostream>
using namespace std;
int Num = 100;//定义全局变量
int main()
{
	extern int number;//错误!!!!,局部变量不具有外部链接性
	cout << Num << endl;
	return 0;
}
/*文件2*/
#include<iostream>
using namespace std;
void display()
{
	int number=200int Num=500//与文件1中的不冲突!!
	cout << Num << endl;
}

四、将外部变量的作用域限制在本文件中

若想将某些外部变量只限于本文件中,而不被其他文件引用。这时候可以在定义外部变量(全局变量)时加一个static声明;

/*文件1*/
#include<iostream>
using namespace std;
extern int Num;
int main()
{
	/*extern int number;
	cout << number << endl;*/
	cout << Num << endl;
	return 0;
}
/*文件2*/
#include<iostream>
using namespace std;
static int Num = 50;//static声明后不具有外部连接性
void display()
{
	int number = 200;
	cout << Num << endl;
}

执行后将发生错误,由于Num用static声明,所以其不再具有外部链接性;

注意:

用static声明一个变量的作用是:
1.对于局部变量用static声明,把他分配在静态存储区,该变量在整个程序执行期间不释放,其分配的空间始终存在;
2.对于全局变量用static声明,则把该变量的作用域只限于本文件模块(即被声明的文件中),即取消外部衔接性

参考资料:《C程序设计<第四版>》谭浩强 著.北京:清华大学出版社


版权声明:本文为Destiny_zc原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。