1

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

类类型的静态或全局变量是被禁止的:由于构造和销毁的不确定顺序,它们会导致难以发现的错误。

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

该指南还说:

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

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

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

4

3 回答 3

3

谷歌显然试图保持规则简单。因此,虽然在某些情况下它可能非常安全,但描述这些例外情况会很困难。允许这些例外的好处可能不足以保证这种额外的复杂性。

于 2012-09-17T04:15:51.583 回答
2

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

于 2012-09-17T05:03:15.247 回答
0

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

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

于 2012-09-17T03:12:37.330 回答