realkate1

导航

C++全局变量在多个源代码文件中的使用

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

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

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

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

 

  1. #include "def.h"  
  2. #include  <iostream>  
  3.   
  4. using namespace std;  
  5.   
  6. int main()  
  7. {  
  8.     cout<<var<<endl;  
  9.     return 0;  
  10. }  

 

 

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

 

  1. #include  "def.h"  
  2.   
  3. int var;    //可以赋初值,也可以这样  

 

 

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

 

  1. #ifndef  _DEF_H  
  2. #define _DEF_H  
  3.   
  4. extern int var;  
  5.   
  6. #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函数的头文件;

 

  1. static  int  snum=22;  
  2. static  int  sme;  
  3. void fun();  


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

 

 

  1. #include "def.h"  
  2. #include  <iostream>  
  3.   
  4. using namespace std;  
  5.   
  6. void fun()  
  7. {  
  8.     snum=33;  
  9.     sme=3;  
  10.     cout<<snum<<", "<<sme<<endl;  
  11. }  

mod.h:输出全局变量值的另外一个头文件;

 

 

  1. #include "def.h"  
  2. #include <iostream>  
  3.   
  4. using namespace std;  
  5.   
  6. void fun2()  
  7. {  
  8.     cout<<snum<<", "<<sme<<endl;  
  9. }  


main.cc:执行入口;

 

 

  1. #include "def.h"  
  2. #include "mod.h"  
  3. #include <iostream>  
  4.   
  5. using namespace std;  
  6.   
  7. int main()  
  8. {  
  9.     cout<<snum<<", "<<sme<<endl;  
  10.     fun();  
  11.     fun2();  
  12. }  


输出结果:

 

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

 

posted on 2015-09-21 20:16  realkate1  阅读(682)  评论(0编辑  收藏  举报