多文件之间的变量引用
局部变量是无法跨文件引用的,能跨文件引用的都是全局变量。在源文件中定义一个全局变量,如果想要该变量可以被其他源文件引用,需要在前面加上extern关键字,而引用该全局变量的源文件,在引用之前,需要使用extern关键字引入全局变量。例如,有一个程序中有两个源文件demo.c和test.c,test.c源文件中定义了一个全局变量a,可以被其他源文件引用,则test.c中定义全局变量a的代码如下:
extern int a = 100; //全局变量a可以被其他源文件引用
demo.c源文件要引用test.c源文件中的全局变量a,则需要使用extern关键字引入变量a,示例代码如下:
extern a; //引入其他源文件中的全局变量a
int main()
{
printf("%d\n", a); //使用变量a
return 0;
}
现在编译器默认源文件中的全局变量可以被其他源文件引用,因此在定义时可以不加extern关键字。test.c源文件中的全局变量a,可以省略extern关键字,示例代码如下:
int a = 100; //省略extern关键字,全局变量a默认可以被其他源文件引用
但是,有些情况下,在本文件中定义的全局变量只是为了辅助完成本模块的功能,而不想让其他源文件引用,这时可以使用static关键字修饰全局变量,这样其他源文件就无法引用该全局变量了。例如,在test.c源文件中定义一个全局变量count,count只在本文件中有效,不能被其他源文件引用,示例代码如下:
static int count = 0; //count为静态全局变量
test.c源文件中的count被static修饰,称为静态全局变量。静态全局变量不能被其他源文件引用。在demo.c中引用count,示例代码如下:
extern count; //引用test.c源文件中的静态全局变量count
int main()
{
printf("%d\n", count); //输出count的值
return 0;
}
在编译demo.c文件中的代码时,编译器会报错,错误提示如图1所示。
图1 demo.c引用静态全局变量count的错误提示
由图1可知,在demo.c源文件中引用test.c源文件中的静态全局变量是非法的。static除了保护全局变量不被其他源文件引用之外,还可以解决变量重名问题,如果有两个源文件都定义了全局变量count,在demo.c源文件中使用extern引入count,就会发生重名错误,而使用static修饰其中一个全局变量,就能很好解决重名问题。