zoukankan      html  css  js  c++  java
  • C++全局变量在多个源码文件里的使用

    在比較大的项目中,假设须要使用全局变量。那么就须要注意一些全局变量声明、使用不当引起的问题了。

    本篇文章主要内容有两个:普通全局变量、静态全局变量、全局常量。

    1、普通全局变量:如果我们须要在多个不同的编译单元(比方两个.cc文件)中使用全局变量进行传值,如我们有例如以下三个源代码文件:

    main.cc:执行入口,有一个main函数。当中会打印出全局变量var的值;

    #include "def.h"
    #include  <iostream>
    
    using namespace std;
    
    int main()
    {
        cout<<var<<endl;
        return 0;
    }

    def.cc:全局变量var的定义处;

    #include  "def.h"
    
    int var;    //能够赋初值,也能够这样

    def.h: 全局变量var的声明处。

    #ifndef  _DEF_H
    #define _DEF_H
    
    extern int var;
    
    #endif

    注意:

    在linux里编译的时候def.cc和main.cc都要编译(我自己写的时候就是忘记编译def.cc了,傻傻的发现main.cc编译出错。

    。。

    )。

    在.h中用extern声明全局变量。在某一个.cc文件里定义该全局变量,且在定义处包括声明的.h头文件。这样保证该全局变量在总体上仅仅定义一次(否则假设在.ht头文件里定义的话。编译时会遇到多重定义错误),然后再使用全局变量的其它编译单元的.cc文件里。仅仅需包括该.h头文件就可以;

    extern 声明表示在此处引入外部定义变量的声明。而不是在本编译单元中再声明一个同名的局部变量。


    2、静态全局变量:即使用static修饰的全局变量,他不能使用extern进行引入声明,即extern与static不能够一起使用。并且static全局变量与普通全局变量有非常大不同。我们使用一个測试程序来说明;

    def.h:定义static全局变量var以及fun函数的头文件。

    static  int  snum=22;
    static  int  sme;
    void fun();
    

    def.cc:定义fun函数的源文件。

    #include "def.h"
    #include  <iostream>
    
    using namespace std;
    
    void fun()
    {
        snum=33;
        sme=3;
        cout<<snum<<", "<<sme<<endl;
    }
    
    mod.h:输出全局变量值的另外一个头文件;

    #include "def.h"
    #include <iostream>
    
    using namespace std;
    
    void fun2()
    {
        cout<<snum<<", "<<sme<<endl;
    }

    main.cc:运行入口;

    #include "def.h"
    #include "mod.h"
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        cout<<snum<<", "<<sme<<endl;
        fun();
        fun2();
    }

    输出结果:

    22,0

    33,3

    22,0


    能够看出,调用了fun()之后,在fun2()中打印出来的值并没有改变,原因是:static修饰的全局变量的作用域仅仅是其本身所在的编译单元(在本编译单元内更改生效),在其它单元中使用时,该变量会有新的内存地址,也就是说,每个使用它的编译单元都给它开辟了单独的空间,并把它的初始值复制过来,这样假设某个单元中对它进行了改动,那么多个编译单元中它的值就可能不一样了;


    注意:

    static修饰的全局变量声明与定义是一体的,在头文件里声明了static全局变量。同一时候也是定义了它。不像普通的全局变量是分开的;

    多个编译单元都包括static全局变量所在的头文件,不会引起重定义错误,由于每一个编译单元都开辟了新的空间存储它;


    3、const全局变量:const全局变量使用起来与普通全局变量一样,在.cc中定义并赋初值。在.h头文件里用extern进行声明,然后再须要使用的地方包括.h就可以。在多个编译单元中其内存地址也不同(这一点与static全局变量类似)。可是因为是常量,不能改动其值。所以即使内存地址不一样也没影响,值都一样。



    參考致谢:http://blog.csdn.net/candyliuxj/article/details/7853938















  • 相关阅读:
    MVC 自定义异常过滤特性
    写一个左中右布局占满屏幕,其中左右两块是固定宽度200,中间自适应宽度, 要求先加载中间块,请写出结构及样式。
    请写出jQuery绑定事件的方法,不少于两种
    用js写个原生的ajax过程
    link和@import的区别
    attribute和property的区别是什么?
    请简要描述margin重复问题,及解决方式
    display:none;与visibility:hidden;的区别
    web标准以及w3c标准
    css优先级
  • 原文地址:https://www.cnblogs.com/wgwyanfs/p/6953320.html
Copyright © 2011-2022 走看看