学科分类
目录
C语言

多文件之间的变量引用

局部变量是无法跨文件引用的,能跨文件引用的都是全局变量。在源文件中定义一个全局变量,如果想要该变量可以被其他源文件引用,需要在前面加上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修饰其中一个全局变量,就能很好解决重名问题。

点击此处
隐藏目录