外部变量是在函数的外部定义的全局变量,它的作用域是从变量的定义处开始一直到本程序的结尾。但有以下希望能扩展外部变量的作用域的情况:
1、在一个文件内扩展外部变量的作用域
外部变量的作用域为定义处到文件结束,在定义之前的函数都不能引用该外部变量。但是如果需要定义点之前的函数也能引用该外部变量,则应该在引用之前使用关键字extern对该变量作“外部变量声明”,表示把该外部变量的作用域扩展到此位置,那么就能在该外部变量定义处之前合法使用该外部变量了。
例子:
#include<stdio.h>
//调用函数,求三个整数中的大者
//用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<stdio.h>
//给定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;
}
运行结果:
解析:
- 假设某一程序有5个源文件,那么只需要在其中一个源文件中定义外部变量A,然后在其余四个文件中使用关键字extern声明外部变量即可。各文件经过编译后会连接成一个可执行的目标文件。
- 用这种方法扩展全局变量的作用域应十分慎重,因为在执行一个文件中的操作时可能会改变该全局变量的值,这样就会影响到另一个文件中全局变量的值,从而影响该文件中函数的执行结果。
3、将外部变量的作用域限制在本文件中
若希望外部变量仅限于被本文件使用,而不被其它文件使用,那么可以在定义外部变量时加上一个static,例如:
static int A;
int main()
{
......
}
这样在其它文件中就算使用“extern A”,也不能使用本文件的外部变量A。
这种加上static声明,只能用于本文件的外部变量成为“静态外部变量”。
用static声明一个变量的作用:
(1)对局部变量用static声明,把它分配在静态存储区,该变量在整个程序执行期间所在的存储单元都不会释放。
(2)对全局变量用static声明,则该变量的作用域只限于本文件模块(即被声明的文件中)