免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5318 | 回复: 10
打印 上一主题 下一主题

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

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 10:01:44
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-07-09 09:53 |只看该作者 |倒序浏览
类型的全局变量是被禁止的,内建类型的全局变量是允许的,当然多线程代码中非常数全局变量也是被禁止的。永远不要使用函数返回值初始化全局变量。
不幸的是,全局变量的构造函数、析构函数以及初始化操作的调用顺序只是被部分规定,每次生成有可能会有变化,从而导致难以发现的bugs。
因此,禁止使用class类型的全局变量(包括STL的string, vector等等),因为它们的初始化顺序有可能导致构造出现问题。

内建类型和由内建类型构成的没有构造函数的结构体可以使用,如果你一定要使用class类型的全局变量,请使用单件模式(singleton pattern)。
对于全局的字符串常量,使用C风格的字符串,而不要使用STL的字符串:const char kFrogSays[] = "ribbet";
虽然允许在全局作用域中使用全局变量,使用时务必三思。大多数全局变量应该是类的静态数据成员,或者当其只在.cc文件中使用时,将其定义到不具名命名空间中,
或者使用静态关联以限制变量的作用域。

记住,静态成员变量视作全局变量,所以,也不能是class类型!


问题:全局变量不能是class或者stl的string,vector等? 不太明白谁能解释下,我现在有个程序有个消息队列用的是一个全局的list,没感觉有问题啊。

论坛徽章:
1
技术图书徽章
日期:2014-03-06 15:32:30
2 [报告]
发表于 2014-07-09 09:59 |只看该作者
意思是,类全局变量的构造函数有可能不会被执行

论坛徽章:
12
巳蛇
日期:2013-09-16 15:32:242015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之约旦
日期:2015-02-11 14:38:37双鱼座
日期:2015-01-05 11:05:47戌狗
日期:2014-12-08 09:41:18戌狗
日期:2014-08-15 09:29:29双子座
日期:2014-08-05 09:17:17卯兔
日期:2014-06-08 15:32:18巳蛇
日期:2014-01-27 08:47:08白羊座
日期:2013-11-28 21:04:15巨蟹座
日期:2013-11-13 21:58:012015年亚洲杯之科威特
日期:2015-04-17 16:51:51
3 [报告]
发表于 2014-07-09 10:00 |只看该作者
不是说用了全局对象就一定出错,只是这么做非常危险。如果确实需要,声明个指针然后手工初始化就ok了。

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
4 [报告]
发表于 2014-07-09 10:11 |只看该作者
只是初始化顺序不一定,我觉得如果只有一个,或者多个之间没有依赖关系,用也没关系

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 10:01:44
5 [报告]
发表于 2014-07-09 10:17 |只看该作者
回复 3# zhaohongjian000

我现在写了一个类 class CDataprocMod : public CModule , CModule封装了线程,有个start()函数是启动线程的。

我想在程序生成一个处理线程(等待信号工作),现在用的是 extern CDataprocMod  g_DataprocMod; 这样一个全局变量,在主程序main中调用
g_DataprocMod.start() ,  请问这样会有问题吗?  不适用全局变量有更好的方式吗?  

感谢回复~

   

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 10:01:44
6 [报告]
发表于 2014-07-09 10:19 |只看该作者
回复 2# selfrun

如果我用string 变量, 初始没有值, 只是在main中读取配置文件中赋值 ,这样构造函数不调用也没有关系吧?

   

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 10:01:44
7 [报告]
发表于 2014-07-09 10:22 |只看该作者
回复 4# hellioncu

我5楼的内容是我的疑惑,我一直这样生成线程的,应该没问题吧?

论坛徽章:
12
巳蛇
日期:2013-09-16 15:32:242015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之约旦
日期:2015-02-11 14:38:37双鱼座
日期:2015-01-05 11:05:47戌狗
日期:2014-12-08 09:41:18戌狗
日期:2014-08-15 09:29:29双子座
日期:2014-08-05 09:17:17卯兔
日期:2014-06-08 15:32:18巳蛇
日期:2014-01-27 08:47:08白羊座
日期:2013-11-28 21:04:15巨蟹座
日期:2013-11-13 21:58:012015年亚洲杯之科威特
日期:2015-04-17 16:51:51
8 [报告]
发表于 2014-07-09 10:23 |只看该作者
回复 5# sundae333


    单例模式 是这种情况下的标准用法。 重要的是你要弄明白这几种用法的具体区别。

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 10:01:44
9 [报告]
发表于 2014-07-09 10:53 |只看该作者
回复 8# zhaohongjian000

能举个错误使用的例子吗,我对比看下应该就明白了,thanks~~~

论坛徽章:
12
巳蛇
日期:2013-09-16 15:32:242015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之约旦
日期:2015-02-11 14:38:37双鱼座
日期:2015-01-05 11:05:47戌狗
日期:2014-12-08 09:41:18戌狗
日期:2014-08-15 09:29:29双子座
日期:2014-08-05 09:17:17卯兔
日期:2014-06-08 15:32:18巳蛇
日期:2014-01-27 08:47:08白羊座
日期:2013-11-28 21:04:15巨蟹座
日期:2013-11-13 21:58:012015年亚洲杯之科威特
日期:2015-04-17 16:51:51
10 [报告]
发表于 2014-07-09 12:00 |只看该作者
  1. class A;
  2. A a;
  3. class B
  4. {
  5. B(){
  6. a.function();  
  7. }
  8. };

  9. B b;
复制代码
调用b的构造函数时,a可能还未初始化。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP