📄 codetc12.dat
字号:
extern 声明外部变量
外部变量(即全局变量)是在函数的外部定义的,它的作用域为从变量的定义处开始到本程序文件的末尾.在此作用域内,全局变量可以为程序各个函数所引用.编译时将外部变量分配在静态存储区内.
有时需要用extern来声明外部变量,以扩展外部变量的作用域.
1. 在一个文件内声明外部变量
如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到文件终了.如果在定义点之前的函数想引用该外部变量,则应该在引用之前用关键字extern对该变量 作"外部变量声明".表示该变量是一个已经定义的外部变量.例如:
用extern声明外部变量,扩展程序文件中的作用域.
int max(int x,int y) /* 定义max函数 */
{
int z;
z=x>y? x:y;
return(z);
}
main()
{
extern A,B; /*外部变量声明 */
printf("%d",max(A,B);
}
int A=13,b=-8; /*定义外部变量 */
运行结果: 13
在本程序文件的最后 1行定义了外部变量A,B,但由于外部变量定义的位置在函数main之后,因此本来在main函数中不能引用外部变量A和B.现在我们在main函数的第 2行 用extern对A和B进行"外部变量声明",表示A和B是已经定义的外部变量.这样在main函数中就可以合法地使用全局变量A和B了.如果不作extern声明,编译时出错,系统不会认 为A和B是已定义的外部变量.一般做法是外部变量的定义放在引用它的所有函数这前,这样可以避免在函数中多加一个extern声明.
用extern声明外部变量时,类型名可以写也可以省写.例如上例中的"extern int A;"也可以写成:"extern A;".
2. 在多个文件的程序中声明外部变量
一个C程序可以由一个或多个源程序文件组成.如果程序只由一个源文件组成,使用外部变量的方法前面已经介绍.如果程序由多个源文件组成,那么在一个文件中想引用另 一个文件已定义的外部变量,有什么办法呢?
如果一个程序包含两个文件,在两个文件中都要用到同一个外部变量NUM,不能分别在两个文件中各自定义一个外部变量NUM,否则在进行程序的连接时会出现"重复定义"的 错误.正确的做法是:在任一个文件中定义外部变量NUM,而在另一个文件中用extern对NNUM作"外部变量声明".即 extern NUM;在编译和连接时,系统会由此知道NUM是一个已 在别处定义的外部变量,并将在另一文件中定义的外部变量的作用域扩展到本文件,在本文件中可以合法地引用外部变量NUM.
下面举一个简单的例子来说明这种引用.
例题:用extern将外部变量的作用域扩展到其他文件.
本程序的作用是给定b的值,输入a和m,求a*b和a的m次方的值.
文件file1.c中的内容为:
int A; /* 定义外部变量 */
main()
{
int power(int); /* 对调用函数作声明 */
int b=3,c,d,m;
printf("Enter the number a and its power m: \n");
scanf("%d,%d",&A,&m);
c=A*b;
printf("%d * %d = %d\n",A,b,c);
d=power(m);
printf("%d * * %d=%d",A,m,d);
}
文件file2.c中的内容为:
extern A; /* 声明A为一个已定义的外部变量 */
power(int n);
{
int i,y=1;
for(i=1;i<=n;i++)
y*=A;
return(y);
}
可以看到,file2.c文件中的开头有一个extern声明,它声明在本文件中出现的变量A是一个已经在其他文件中定义过的外部变量,本文件不必在为它分配内存.本来外部变 量A的作用域是file1.c,但现在用extern声明将其作用域扩大到file2.c文件.假如程序有5个源文件,在一个文件中定义外部整型变量A,其他4个文件都可以引用A,但必须在 每一个文件中都加上一个extern A;声明.在各文件经过编译后,将各目标文件联接成一个可执行的目标文件.但是用这样的全局变量应十分慎重,因为在执行一个文件中的函数 时,可能会改变了该全局变量的值,它会影响到另一个文件中的函数执行结果.
有的读者可能会问:extern既可以用来扩展外部变量在本文件中的作用域,又可以使外部变量的作用域从一个文件扩展到其他文件,那么系统怎么区别处理呢?实际上,在编 译时遇到extern时,先在本文件中找外部变量的定义,如果找到,就在本文件中扩展作用域.如是找不到,不在连接时从其他文件中找外部变量的定义,如果找到,就将作用域扩展 到本文件,如果找不到,按出错外理.
3. 用static声明外部变量
有时在程序设计中希望某些外部变量只限于被本文件引用,而不能被其他文件引用.这时可以在定义外部变量时加上一个static声明.例如:
file1.c file2.c
static int A; extern int A;
main() fun(int n)
{ {
. A=A*n;
. .
. .
} }
在file1.c中定义了一个全局变量A,但它用static声明,因此只能用于本文件,虽然在file2.c文件中用了extern int A;但file2.c文件中无法使用file1.c中的全局变 量A.这种加上static声明,只能用于本文件的外部变量(全局变量)称为静态外部变量,在程序设计中,常由若干人分别完成各个模块,各人可以独立地在其设计的文件中使用相 同的外部变量名而互不相干.只需在每个文件中的外部变量前加上static即可.这就为程序的模块化,通用性提供方便.如果已知道其他文件不引用本文件的外部变量,可以对本 文件中的外部变量都加上static,成为静态外部变量,以免被其他文件误用.
需要指出对外部变量加static声明,并不意味着这时才是静态存储(存放在静态存储区中),而不加static的是动态存储(存放在动态存储区中).两种形式的外部变量都是静态存储方式,只是作用范围不同而已,都是在编译时分配内存的.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -