<C语言学习>全局变量作用域的扩展

外部变量是在函数的外部定义的全局变量,它的作用域是从变量的定义处开始一直到本程序的结尾。但有以下希望能扩展外部变量的作用域的情况:

1、在一个文件内扩展外部变量的作用域

外部变量的作用域为定义处到文件结束,在定义之前的函数都不能引用该外部变量。但是如果需要定义点之前的函数也能引用该外部变量,则应该在引用之前使用关键字extern对该变量作“外部变量声明”,表示把该外部变量的作用域扩展到此位置,那么就能在该外部变量定义处之前合法使用该外部变量了。
例子:

#include

//调用函数,求三个整数中的大者
//用extern声明外部变量,扩展外部变量在程序文件中的作用域

int max();

int main()
{
     
	extern int a, b, c;      //把外部变量a,b,c的作用域扩展到从此处开始
	printf("input three integer numbers:");
	scanf_s("%d %d %d", &a, &b, &c);
	printf("max is %d\n", max());

	system("pause");

}

int a, b, c;               //定义外部变量a,b,c

int max()
{
     
	int m;
	m = a > b ? a : b;
	if (c > m)
	{
     
		m = c;
	}
	return m;
}

运行结果:
在这里插入图片描述

解析:

  • 由于外部变量a,b,c是定义在main()函数后面的,因此本来在main()函数中应该是不能引用外部变量a,b,c的。但是由于在main()函数中用extern关键字对a,b,c进行了“外部变量声明”,把a,b,c的作用域扩展到该位置。这样就可以在main()函数中合法地使用全局变量a,b,c了;

  • 由于a,b,c是外部变量,因此在调用max()函数时不用传递参数,可以直接使用a,b,c

  • 使用extern声明外部变量时,类型名可以省略。
    例如:

extern int a,b,c  等同于 extern a,b,c

因为这不是定义变量,可以不指定类型,写出外部变量名即可。


**

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

**

第一种情况是在同一个源文件中使用外部变量的方法,如果有多个源文件,想在A文件中引用B文件中的已定义外部变量,该如何做?

  • 假设一个程序包含两个文件,两个文件都需要用到同一个外部变量Num,若在两个文件中各自定义一个外部变量Num,将会在进行程序的连接时出现“重复定义”的错误。
  • 因此,正确的做法是:在任一个文件中定义外部变量Num,然后在另一个文件中用关键字extern进行“外部变量声明”,即“extern Num”。
  • 在编译和链接时,系统就会知道Num有外部链接,可以从别处找到已定义的外部变量Num,并将另一个文件中定义的外部变量Num的作用域扩展到本文件,那么就可以在本文件中合法的使用变量Num了。
    例子:
    分别编写两个源文件文件file1和file2,在file1中定义外部变量A,在file2中用extern来声明外部变量,把A的作用域扩展到file2中

file1:

//file1
#include

//给定b的值,输入a和m,求a*b和a**m(a的m次方)的值

int A;     //定义外部变量
int power(int);

int main()
{
     
	int b = 3, c, d, m;
	printf("input a and its power m:");
	scanf_s("%d %d", &A, &m);
	c = A * b;
	printf("%d*%d=%d\n", A, b, c);
	d = power(m);
	printf("%d ** %d=%d\n", A, m, d);
	system("pause");
}

file2:

//file2
extern A;             
//把在file1文件中已定义的外部变量的作用域扩展到本文件
int power(int n)
{
     
	int i, y = 1;
	for ( i = 1; i <= n; i++)
	{
     
		y *= A;
	}

	return y;
}

运行结果:
<C语言学习>全局变量作用域的扩展_第1张图片

解析:

  • 假设某一程序有5个源文件,那么只需要在其中一个源文件中定义外部变量A,然后在其余四个文件中使用关键字extern声明外部变量即可。各文件经过编译后会连接成一个可执行的目标文件。
  • 用这种方法扩展全局变量的作用域应十分慎重,因为在执行一个文件中的操作时可能会改变该全局变量的值,这样就会影响到另一个文件中全局变量的值,从而影响该文件中函数的执行结果。

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

若希望外部变量仅限于被本文件使用,而不被其它文件使用,那么可以在定义外部变量时加上一个static,例如:

static int A;
int main()
{
     
	......
}

这样在其它文件中就算使用“extern A”,也不能使用本文件的外部变量A。

这种加上static声明,只能用于本文件的外部变量成为“静态外部变量”。

用static声明一个变量的作用:
(1)对局部变量用static声明,把它分配在静态存储区,该变量在整个程序执行期间所在的存储单元都不会释放。
(2)对全局变量用static声明,则该变量的作用域只限于本文件模块(即被声明的文件中)

你可能感兴趣的:(C语言学习)