免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1737 | 回复: 9

[C++] 全局变量问题 [复制链接]

论坛徽章:
0
发表于 2013-11-28 20:31 |显示全部楼层
如在a.h文件中定义了全局变量
static bool _DEBUG=false;

class a
{

};
现在在b类的cpp中做了操作
#include "a.h"

bool b::set()
{
   _DEBUG=true;
}
可现在在a.cpp中取得_DEBUG却还是false,想问下是不是程序哪里做错了

论坛徽章:
3
摩羯座
日期:2013-11-12 20:06:19午马
日期:2013-11-27 16:35:55双鱼座
日期:2014-04-04 19:02:30
发表于 2013-11-28 20:50 |显示全部楼层
你确定不是你 打开的方式 不对吗?

论坛徽章:
0
发表于 2013-11-28 21:05 |显示全部楼层
a.cpp和b.cpp中分别有一个bool _DEBUG=false;。所以a.cpp中的_DEBUG仍然是false。

论坛徽章:
0
发表于 2013-11-29 08:31 |显示全部楼层
只有在a.h中定义了_DEBUG,为什么会是a,b类都有呢?
回复 3# lsnl8480


   

论坛徽章:
6
技术图书徽章
日期:2013-11-13 11:11:27子鼠
日期:2014-02-20 17:54:13处女座
日期:2014-06-16 17:43:33午马
日期:2014-08-08 09:11:17未羊
日期:2014-08-10 11:57:072015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2013-11-29 08:52 |显示全部楼层
本帖最后由 littledick 于 2013-11-29 08:55 编辑
wuzen007 发表于 2013-11-29 08:31
只有在a.h中定义了_DEBUG,为什么会是a,b类都有呢?
回复 3# lsnl8480

http://bbs.chinaunix.net/forum.p ... %3D22%26typeid%3D22
0080.JPG
顶楼第7条。

论坛徽章:
7
巳蛇
日期:2014-04-10 08:54:57白羊座
日期:2014-04-22 20:06:262015年亚洲杯之沙特阿拉伯
日期:2015-02-10 14:18:532015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之吉达阿赫利
日期:2015-06-02 11:34:112015亚冠之武里南联
日期:2015-06-24 12:13:082015亚冠之阿尔纳斯尔
日期:2015-08-03 09:08:25
发表于 2013-11-29 08:54 |显示全部楼层
回复 4# wuzen007


    因为#include "a.h"就相当于把a.h里的内容复制一份,这跟你把a.h的内容直接写在a.cpp 和b.cpp里是一样的,然后如果你实际上是这样写的话你就知道为什么了。

论坛徽章:
0
发表于 2013-11-29 09:01 |显示全部楼层
明白了,那如果要实现我说的效果要怎么做呢
回复 6# Monox


   

论坛徽章:
7
巳蛇
日期:2014-04-10 08:54:57白羊座
日期:2014-04-22 20:06:262015年亚洲杯之沙特阿拉伯
日期:2015-02-10 14:18:532015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之吉达阿赫利
日期:2015-06-02 11:34:112015亚冠之武里南联
日期:2015-06-24 12:13:082015亚冠之阿尔纳斯尔
日期:2015-08-03 09:08:25
发表于 2013-11-29 09:15 |显示全部楼层
回复 7# wuzen007


    在一个cpp文件里定义变量,不加static,也就是
  1. bool _DEBUG=false;
复制代码
在头文件里加一句
  1. extern bool _DEBUG;
复制代码
然后在其它cpp文件里就可以修改这个变量了。

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
发表于 2013-11-29 09:37 |显示全部楼层
要弄清楚这个东西为什么会这样以及如何避免,你首先要了解编译文件的过程。编译器编译文件以每个.c或.cpp等源文件为“单元”进行编译,.h不会被直接作为一个“单元”进行编译而是由.c或.cpp直接或间接包含的情况下才会被编译到。而这些个“单元”之间的编译过程是相对独立的,相互之间的编译过程不受干扰,可以生成不相关的.o中间文件,最终由链接器把这些中间文件链接起来生成可执行文件。
你这里的a.cpp和b.cpp分别独立进行编译,由于他们都包含了a.h,于是独立编译完的.o里面都有一个_DEBUG变量,如果这个_DEBUG不是static的,那么最后链接过程就会报“符号重定义”错误(因为有两个_DEBUG同名了),而由于你这里的_DEBUG是static的,于是符号名被抹去得以链接成功,但是被抹去的只是符号名,有两个不同的_DEBUG仍然是事实不容否定。
如果知道了这个原理,应该怎么做,相信你自己也能推算出来了。

论坛徽章:
0
发表于 2013-11-29 10:02 |显示全部楼层
本帖最后由 syre 于 2013-11-29 10:08 编辑

有没有完整一点的代码?用static本来没错,不过得放.cpp里面
static是保证编译单元里的静态。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

DTCC2020中国数据库技术大会

【架构革新 高效可控】2020年12月21日-23日第十一届中国数据库技术大会将在北京隆重召开。

大会设置2大主会场,20+技术专场,将邀请超百位行业专家,重点围绕数据架构、AI与大数据、传统企业数据库实践和国产开源数据库等内容展开分享和探讨,为广大数据领域从业人士提供一场年度盛会和交流平台。

http://dtcc.it168.com


大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP