外部变量

外部变量

  外部变量是在函数外部定义的全局变量,它的作用域是从变量的定义处开始,到本程序文件的结尾。在此作用域内,全局变量可为各个函数所引用。编译时将外部变量分配在静态存储区。

简单使用

int  e_extern = 10;		//编译器自动编译为extern int e_extern = 10;

聊聊声明和定义

  1. 全局变量没有赋值,就是声明
  2. 函数可以有多个声明,全局变量可以有多个声明
  3. 函数只能有一个定义,全局变量有一个定义
  4. 定义就是全局变量的实体,声明变量只是全局变量存在

具体看看代码,全局变量

int num;			//声明
int num;
int num;


int num = 10;			//定义
int num = 20;			//如果再次定义的话,就会出现error C2374: “num”: 重定义;多次初始化

局部变量

void test()
{
	int num = 10;	//auto类型的变量 在作用域内不能重复定义
	int num = 20;	//两次都是定义,自动变量没有声明的,出现error C2374: “num”: 重定义;多次初始化	
}

初始化

int num;							//声明
int arr[10];

int main(int argc, char *argv[])
{
	printf("%d\n", num);   //如果不进行初始化,编译器会将该变量自动初始化为0,变量/数组和结构体也是初始化为0
	
	for (int i = 0; i < 10; i++)
	{
		printf("arr[%d]=%d ", i, arr[i]);
	}
	system("pause");
	return 0;
}

局部 外部变量

int main(int argc, char *argv[])
{
	{
		extern int a;      //声明a的可见域是在当前块内,在外部无法使用
		printf("a=%d\n", a);
	}
	system("pause");
	return 0;
}

理清外部变量

int num;

int main(int argc, char *argv[])
{

	{
		//块语句内部的变量如果与全局变量重名,在当前块语句是从定义到块语句结束
		//内层块语句的变量如果与外层块语句变量重名,则该变量的作用是内层块语句定义到块语句结束
		//内层的变量会屏蔽外层的变量
		printf("num1=%d\n", num);
		int num = 100;
		printf("num2=%d\n", num);
		{
			printf("num3=%d\n", num);
			int num = 168;
			printf("num4=%d\n", num);
		}
		printf("num5=%d\n", num);
	}
	printf("num6=%d\n", num);
	system("pause");
	return 0;
}


多文件使用使用外部变量

global.c

int global_val = 10;

main.c

extern int global_val;          //引用全局变量,跨文件使用,extern可以省略,但要声明,全局变量的作用域是全局的,但有可见域,要使用合适的声明,声明就是全局变量的可用域

int main(int argc, char *argv[])
{
	printf("global_val=%d", global_val);
	system("pause");
	return 0;
}

与外部变量对比的,就是静态变量,具体点击查看静态变量

秋风 2016-09-05