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
C++全局变量在多个源代码文件中的使用的更多相关文章
- C语言:全局变量在多个c文件中公用的方法 [转]
用C语言编写程序的时候,我们经常会遇到这样一种情况:希望在头文件中定义一个全局变量,然后包含到两个不同的c文件中,希望这个全局变量能在两个文件中共用. 举例说明:项目文件夹project下有main. ...
- VS开发】C中调用C++文件中定义的function函数
[VS开发]C中调用C++文件中定义的function函数 标签(空格分隔): [VS开发] 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 精要一揽 C调用 ...
- 独立的js文件中不能使用EL表达式取值
在独立的js文件中写了一个EL表达式取值,发现没有取到值,原因在于不能在独立的js文件中使用EL表达式,可以在jsp页面定义全局变量,然后在js文件中引用
- 效率最高的Excel数据导入---(c#调用SSIS Package将数据库数据导入到Excel文件中【附源代码下载】) 转
效率最高的Excel数据导入---(c#调用SSIS Package将数据库数据导入到Excel文件中[附源代码下载]) 本文目录: (一)背景 (二)数据库数据导入到Excel的方法比较 ...
- c语言头文件中定义全局变量的问题
c语言头文件中定义全局变量的问题 (转http://www.cnblogs.com/Sorean/) 先说一下,全局变量只能定义在 函数里面,任意函数,其他函数在使用的时候用extern声明.千万不要 ...
- 今天在Mac机器上使用了Flex Builder编辑了一个源代码文件,保存后使用vim命令去打开时发现系统自动在每一行的结尾添加了^M符号,其实^M在Linux/Unix中是非常常见的,也就是我们在Win中见过的/r回车符号。由于编辑软件的编码问题,某些IDE的编辑器在编辑完文件之后会自动加上这个^M符号。看起来对我们的源代码没有任何影响,其实并不然,当我们把源代码文件Check In到svn之类
今天在Mac机器上使用了Flex Builder编辑了一个源代码文件,保存后使用vim命令去打开时发现系统自动在每一行的结尾添加了^M符号,其实^M在Linux/Unix中是非常常见的,也就是我们在W ...
- C语言头文件中定义全局变量导致重复定义错误
合作方升级SDK后,程序编译出现变量重复定义的错误,通过错误提示无法找到什么位置重复定义了,但确定是引入新SDK后才出现的错误,从SDK的头文件中查找,最终发现在头文件中定义了全局变量 我们的项目在多 ...
- c++多个文件中如何共用一个全局变量
例子: 头文件:state.h 源文件:state.cpp 其它源文件:t1.cpp t2.cpp t3.cpp, 这些源文件都包含头文件state.h. 需要定义一个全局变量供这些源文件中使 ...
- extern的原理很简单,就是告诉编译器:“你现在编译的文件中,有一个标识符虽然没有在本文件中定义,但是它是在别的文件中定义的全局变量,你要放行!”
extern的原理很简单,就是告诉编译器:“你现在编译的文件中,有一个标识符虽然没有在本文件中定义,但是它是在别的文件中定义的全局变量,你要放行!”
随机推荐
- 测序原理 - PacBio技术资料
手头有一套完整的PacBio技术资料,会慢慢的总结到博客上. 写在前面:PacBio公司主要有两个测序平台一个是RS,一个是最新的Sequel,下面如果没有指明则是在讲RS平台. SMRT测序技术总览 ...
- SAP中寄售处理
寄售分两种: 1, 供应商提供货物,我们销售 2,我们提供货物,寄售商销售 [@more@] 1, 供应商提供货物,我们销售 创建PO,购买寄售货物,categories维护成K,然后收货即可. 2, ...
- IoC 之 2.1 IoC基础(壹)
2.1.1 IoC是什么 Ioc-Inversion of Control,即"控制反转",不是什么技术,而是一种设计思想.在Java开发中,Ioc意味着将你设计好的对象交给容器 ...
- python 练习 16
#!/usr/bin/python # -*- coding: UTF-8 -*- import time myD = {1: 'a', 2: 'b'} for key, value in dict. ...
- Windows Azure免费空间如何搭建PHP网站/数据库、域名绑定
7月份,阿象为大伙介绍了中国版Windows Azure如何建站.自定义远程虚拟机,最高可选四核.28G内存的服务器,相信不少站长.开发者用户大呼过瘾.不过Azure建站系统仅支持SQL数据库,并不支 ...
- border用处多
1. 使用border属性实现梯形 给定一个div,通过设定div四个边框不同的颜色且设置比较粗的边框线条,可以看到div除了中间的content部分,四个边框均成梯形状,既然已经有了梯形的雏形 ...
- 知名黑客组织Anonymous(匿名者)的装备库
原文出处: infosecinstitute 译文出处:freebuf 欢迎分享原创到伯乐头条 本文关注的是世界著名的黑客组织Anonymous(匿名者).“我将描述他们的攻击方法和方式的计划 ...
- 告别node-forever,拥抱PM2
告别node-forever,拥抱PM2 返回原文英文原文:Goodbye node-forever,hello PM2 devo.ps团队对JavaScript的迷恋已经不是什么秘密了;node.j ...
- 《Play for Java》学习笔记(三)template+Message
说明: 这是本书的第八章内容,由于项目需要,提到前面来看啦~~~O(∩_∩)O 一.模板template的定义 Play中的模板是html代码和Scala代码的混合而成的,其中Scala代码以@开头, ...
- 【转】Session ID/session token 及和cookie区别
Session + Cookie 知识收集! cookie机制采用的是在客户端保持状态的方案.它是在用户端的会话状态的存贮机制,他需要用户打开客户端的cookie支持.cookie的作用就是为了解决 ...