C/C++中全局变量的那些事儿(

 C/C++中的变量分为全局变量、静态全局变量、局部变量和静态局部变量,在《C/C++中静态局部变量的特点与应用》中我们介绍过静态局部变量,今天我们的目标是全局变量。

  1. 单个文件中的全局变量
        
    简单一点说,全局变量就是在函数外面定义的变量,下面是一个最简单的实例,一共定义了两个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();
    }
  2. 让全局变量在多个文件中有效

      前面讲过,全局变量的作用域起始于定义的地方直到文件结尾,那岂不是就没法在其他文件中使用了啊。从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_前缀,用以表示这是一个全局变量。

3. 限制全局变量只能在一个文件中有效

      刚才好不容易才把全局变量的作用域扩展到多个文件了,干嘛现在又要限制呢?这是因为虽然全局变量定义后不使用extern关键字的话只能在本文件中使用,但是如果你在其他文件中定义同样名字的全局变量的话,那是不允许滴(在链接的时候会出错),至于详细原因以后再说。

      为了能够实现在不同的文件中使用相同名字的全局变量,static关键字就派上用场了,在《C/C++中静态局部变量的特点与应用》中我们已经说过static关键字了,用static修饰的局部变量只能在定义变量的函数中使用,那么用static修饰的全局变量也就只能在定义其的文件中使用了,这就是传说中的静态全局变量。

#include “stdio.h”

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/

实际工作中,如何定义全局变量呢?

在C++中定义全局变量是应该尽量在.cpp文件中定义,而不要在.h 文件中 定义,定义好了之后,可以在.h文件中利用 extern关键字进行 声明.如果在.h文件中定义的话,多层包含可能会引起重复定义的错误.下面是一个示例
在base.cpp中定义全局变量
base.cpp

int g_MaxTime;
int g_MinTime;
int g_MaxCount;
int g_MinCount;

base.h
<pre name="code" class="cpp">extern int g_MaxTime;
extern int g_MinTime;
extern int g_MaxCount;
extern int g_MinCount;
然后其他文件要使用这些变量的时候
只要#include "base.h"就可以了,而且不会引起重复定义的错误

 



     






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值