C/C++中全局变量的那些事儿
C/C++中的变量分为全局变量、静态全局变量、局部变量和静态局部变量,在《C/C++中静态局部变量的特点与应用》中我们介绍过静态局部变量,今天我们的目标是全局变量。
单个文件中的全局变量
简单一点说,全局变量就是在函数外面定义的变量,下面是一个最简单的实例,一共定义了两个int型的全局变量a和b,这两个全局变量定义的位置不大相同,a定义在函数fun1之前,而b定义在之后,a和b都定义在函数main之前,从使用情况看全局变量a可以在其后面的所有函数中使用,而全局变量b只能在函数main中使用,不能在其定义之前的函数fun1中使用。因此,我们可以得出这样的结论:全局变量的作用域为其定义位置开始,至文件结尾,也即只有文件作用域。
#include “stdio.h”
int a = 1; //这就是个全局变量啦
void fun1() //这个函数只能使用全局变量a,不能用b
{
a++;
printf(“a=%d\n“,a);
}
int b = 2; //这也是个全局变量
void main() //这里a b都可以用
{
fun1();
a++;
printf(“a=%d,b=%d\n“,a,b);
getchar();
}
让全局变量在多个文件中有效
前面讲过,全局变量的作用域起始于定义的地方直到文件结尾,那岂不是就没法在其他文件中使用了啊。从C/C++现在NB的程度上看,这个事情是不可能的,要是这样那还了得。为了使全局变量的作用域扩大到多个文件中,C++中提供了extern关键字。
下面实例代码中的extern int g_c;是做一个声明,说这个变量g_c是一个全局变量啊,你们随便用,g_c本身在其他文件中定义(在本文件中定义也可以,不过要保证其他文件中没有定义过),这样就将全局变量的作用域扩大到多个文件了。
全局变量只要在一个文件中定义后,在其他需要使用的源文件中只要使用extern关键字,即可在该文件中使用,概括下就是:extern扩展全局变量的作用域
#include “stdio.h”
extern int g_c; //声明这是一个外部全局变量
int g_a = 1; //全局变量
void fun1()
{
g_a++;
printf(“g_a=%d,g_c=%d\n“,g_a,g_c);
}
int g_b = 2; //全局变量
void main()
{
fun1();
g_a++;
printf(“g_a=%d,g_b=%d,g_c=%d\n“,g_a,g_b,g_c); //这里直接就用上g_c了
getchar();
}
上做了一点小小的更改,把所有的全局变量全部加上g_前缀,用以表示这是一个全局变量。
限制全局变量只能在一个文件中有效
刚才好不容易才把全局变量的作用域扩展到多个文件了,干嘛现在又要限制呢?这是因为虽然全局变量定义后不使用extern关键字的话只能在本文件中使用,但是如果你在其他文件中定义同样名字的全局变量的话,那是不允许滴(在链接的时候会出错),至于详细原因以后再说。
为了能够实现在不同的文件中使用相同名字的全局变量,static关键字就派上用场了,在C/C++中静态局部变量的特点与应用中我们已经说过static关键字了,用static修饰的局部变量只能在定义变量的函数中使用,那么用static修饰的全局变量也就只能在定义其的文件中使用了,这就是传说中的静态全局变量。
extern int g_c; //其他文件中定义的全局变量
static int g_a = 1; //静态全局变量 限本文件中使用
void fun1()
{
g_a++;
printf(“g_a=%d,g_c=%d\n“,g_a,g_c);
}
int g_b = 2; //全局变量
void main()
{
fun1();
g_a++;
printf(“g_a=%d,g_b=%d,g_c=%d\n“,g_a,g_b,g_c);
getchar();
}
通过static修饰后,我们就可以在不同的文件中使用相同名字的全局变量而不会出现链接错误了。
原创文章请注明转载于知蚁博客,本文地址:http://www.letuknowit.com/archives/87