在多文件的程序中使用extern声明外部变量以扩展其作用域到其他文件
(2012-05-02 09:15:22)
标签:
杂谈 |
分类: C |
一个C程序可以由一个或多个源程序文件组成。如果程序只由一个源文件组成,使用外部变量的方法在“C程序中全局变量的作用范围”一文和“在一个文件内使用关键字extern声明外部变量以扩展其作用域”一文中已经介绍。如果程序由多个源程序文件组成,那么在一个文件中想引用另一个文件中已定义的外部变量,有什么办法呢?
如果一个程序包含两个文件,在两个文件中都要用到同一个外部变量Num,不能分别在两个文件中各自定义一个外部变量Num,否则在进行程序的连接时会出现“重复定义”的错误。正确的做法是:在任意一个文件中定义外部变量Num,而在另一文件中用extern对Num作“外部变量声明”。即
extern Num;
在编译和连接时,系统会由此知道Num是一个已在别处定义的外部变量,并将在另一文件中定义的外部变量的作用域扩展到本文件,在本文件中可以合法地引用外部变量Num。
下面举一个简单的例子来说明这种引用。
例 用extern将外部变量的作用域扩展到其他文件。
本程序的作用是给定b的值,输入a和m,求a×b和am的值。
-
-
int
A; -
void
main(){ -
int power( int); -
int b=3,c,d,m; -
printf("enter 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\n",A,m,d); -
}
-
-
-
extern
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时,先在本文件中找外部变量的定义,如果找到,就在本文件中扩展作用域。如果找不到,就在连接时从其他文件中找外部变量的定义,如果找到,就将作用域扩展到本文件。如果找不到,按出错处理。