为什么类类型的静态和全局变量是危险的?

时间:2012-09-17 03:07:52

标签: c++ c++11 global-variables

http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Static_and_Global_Variables

  

禁止类类型的静态或全局变量:它们会导致   由于不确定的施工顺序而难以发现的错误   破坏。

如果类类型的全局变量不依赖于其他全局变量,例如std::string strvar("abc"),那么使用它有什么不对/不安全?

指南还说:

  

...除了禁止类类型的全局变量之外,我们没有   允许使用a的结果初始化静态POD变量   函数,除非该函数(如getenv()或getpid())   不依赖于任何其他全局变量。

我认为strvar出于同样的原因是好的:它的构造函数本身并不依赖于任何其他全局变量。

我也想知道C ++ 11对POD的宽松定义是否在这方面有任何反映?

3 个答案:

答案 0 :(得分:3)

谷歌显然在努力保持规则的简单化。因此,尽管可能存在一些非常安全的情况,但描述这些异常会很困难。允许这些异常的好处可能不足以保证这种额外的复杂性。

答案 1 :(得分:2)

类的全局和静态实例的问题在于它们的构造/销毁顺序取决于实现。这意味着如果你的代码依赖于它们在某个特定时间出现,你很可能会得到一个不受欢迎的惊喜。

答案 2 :(得分:0)

许多类的实现,尤其是Google标准库中的类,依赖于在程序开始时初始化的全局状态。类构造函数可以以不明显引用其他全局变量的方式打开网络连接或获取单例。

通常,构造函数应该可以自由地假设它们声明的全局变量已经初始化,如果碰巧在链接器初始化对象上静态调用它们,它就会中断。