阿远之生当为

全局变量之苦

最近弄个项目,突然有点偏爱全局变量了,于是乎罔顾教科书的教诲,大用特用,一下就遇到了两个问题,兹记于此,以作教训。
1、由于搞某种设备的读写,针对每种设备写一个工厂类;然后声明一个设备管理类的全局变量,在构造函数里把工厂类全注册到设备管理类中。后来觉得这样不好,每加一种设备都要改构造函数的代码,于是我就写了一个注册类,在构造函数里进行注册,然后在每个设备类的cpp里声明注册类的全局变量。
看起来很完美,于是我打了个lib,弄到另一个dll工程里编译,结果就悲剧了,注册类的构造函数死活不运行。最后发现,编译器认为这个cpp的任何symbol都没被引用,根本就不编译进来,最后只好改回去。

2、而后我又在dll工程里声明了一个全局变量,然后在全局变量的构造函数里,调用设备类的全局变量的成员获取设备列表,结果发现取出来是空的。最后发现,设备类的构造函数在取设备列表时还没有被调用,把初始化的代码移到MFC的app.InitInstance里调用解决问题。

总结下:1、在c#、delphi里用得很顺的工厂注册类,在c++里是会被优化掉的,千万用不得 2、任何情况下,不应在全局变量的构造函数里引用其他全局变量,这条应该不限于c++。

posted on 2012-06-13 23:11 muroachanf 阅读(319) 评论(2)  编辑 收藏 引用

评论

# re: 全局变量之苦 2012-06-14 10:04 小知了了

第二个问题的原因是因为全局变量的初始化次序是不确定的,还可能因此造成LoadLibrary失败。
用静态变量可以解决。  回复  更多评论   

# re: 全局变量之苦 2012-06-15 09:13 muroachanf

@小知了了
不太明白喃,怎么用静态变量解决法。  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理