您的位置:知蚁博客 » C/C++程序设计 » C/C++中全局变量的那些事儿

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

作者: 发布时间:2011-06-01 分类:C/C++程序设计 标签: 8,918人浏览

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

单个文件中的全局变量

  简单一点说,全局变量就是在函数外面定义的变量,下面是一个最简单的实例,一共定义了两个int型的全局变量a和b,这两个全局变量定义的位置不大相同,a定义在函数fun1之前,而b定义在之后,a和b都定义在函数main之前,从使用情况看全局变量a可以在其后面的所有函数中使用,而全局变量b只能在函数main中使用,不能在其定义之前的函数fun1中使用。因此,我们可以得出这样的结论:全局变量的作用域为其定义位置开始,至文件结尾,也即只有文件作用域

C++语言: 知蚁博客

#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扩展全局变量的作用域

C++语言: 知蚁博客

#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修饰的全局变量也就只能在定义其的文件中使用了,这就是传说中的静态全局变量。

C++语言: 知蚁博客
#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

相关文章

19访客评论 ,博主回复13

  1. 棒你增加人气吧,呵呵

    混小子06-02 06:31 回复
    • 多谢支持,呵呵

      知蚁06-02 22:28 回复
  2. 还是C语言,太专业的内容,没法评论了,呵呵

    姜敏06-02 09:42 回复
    • 你看,这还不是评论下来了嘛

      知蚁06-02 22:28 回复
  3. 博主是很牛逼的啊

  4. 这块我不是非常了解

  5. C语言忘得差不多了。

    肖俊06-02 10:57 回复
    • 估计是工作中不怎么会用到吧

      知蚁06-02 22:28 回复
  6. 这货忘记得7788

    • 这东西不经常用,很容易忘掉

      知蚁06-02 22:27 回复
  7. 太专业啦,看不懂,呵呵

    电商圈06-02 14:24 回复
  8. 太专业啦,看不懂,呵呵

    天玉有双06-02 15:37 回复
  9. 来定定了

  10. 我在学C++,考试刚过。哈哈

    自贡SEO06-02 18:19 回复
    • 最恨的就是考试了

      知蚁06-02 22:26 回复
  11. 人越来越多了。。

    恭喜啊。。。~~~

    • 好像越来越少了吧,这几天比较忙,没怎么出去跑,都快没人来了

      知蚁06-02 22:26 回复
      • 今天,我网站都挂了。。昨天的评论。什么都没了。。

        • 不会是访问量太大了吧

          知蚁06-03 23:18 回复
  12. 嘿嘿 刚刚通过考试。博主学的很深刻哦。

    • 对C语言的印象如何?

      知蚁06-03 21:04 回复
  13. 下次抽空,好好跟友情朋友知蚁学习下这块。曾经有点基础的。

    松鼠网06-03 09:21 回复
    • 这些东西你不一定用得到吧,还是学学PHP嘛,呵呵

      知蚁06-03 21:02 回复
  14. 呵呵,说得很对啊!!

  15. 我不大喜欢extern,但有些时候还必须要用 真是纠结

    Pavel06-03 11:12 回复
    • 存在即合理嘛,事物都有两面性,看怎么对待了

      知蚁06-03 21:00 回复
  16. 我最近也开始学习程序

    周舟06-03 15:25 回复
    • 建议你还是学PHP,这个以后会是主流

      知蚁06-03 20:55 回复
  17. 看代码晕乎乎的

    • 有看着不晕的地方,不知道你发现没有——《知蚁体育

      知蚁06-03 23:17 回复
  18. 我同学面试就死在这了哇

    • 往往简单的东西会难倒很多人

      知蚁06-14 21:21 回复

我来说说

(必须)

(必须,保密)

你确定你已经看过文章了?
取消

无觅相关文章插件,快速提升流量