Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么类类型的静态和全局变量是危险的?_C++_C++11_Global Variables - Fatal编程技术网

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

C++ 为什么类类型的静态和全局变量是危险的?,c++,c++11,global-variables,C++,C++11,Global Variables,禁止类类型的静态或全局变量:它们会导致 由于不确定的施工顺序和 毁灭 如果类类型的全局变量不依赖于其他全局变量,例如std::string strvar(“abc”),那么使用它有什么不对/不安全的地方 指南还说: …除了禁止类类型的globals外,我们没有 允许使用 函数,除非该函数(如getenv()或getpid()) 它本身并不依赖于任何其他全球性的东西 我认为strvar是好的,因为同样的原因:它的构造函数本身不依赖于任何其他全局变量 另外,我想知道C++11对POD更宽松的定义是否

禁止类类型的静态或全局变量:它们会导致 由于不确定的施工顺序和 毁灭

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

指南还说:

…除了禁止类类型的globals外,我们没有 允许使用 函数,除非该函数(如getenv()或getpid()) 它本身并不依赖于任何其他全球性的东西

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


另外,我想知道C++11对POD更宽松的定义是否反映了这一点?

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


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

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


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

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

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

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

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

谷歌样式指南并不是C++中的样式指南,也不应该是。你点击了左边的箭头图标吗?它详细解释并包括“此规则完全不允许
向量
(改用C数组)或
字符串
(使用
常量字符[]
)。”请阅读:@GregHewgill。这就是为什么我问这个问题:为什么不允许?谷歌C++风格指南是垃圾的…看谷歌造型指南不是C++中的造型指南,也不应该是。你点击左边的箭头图标了吗?它详细解释并包括“此规则完全不允许
向量
(改用C数组)或
字符串
(使用
常量字符[]
)。”请阅读:@GregHewgill。这就是为什么我问这个问题:为什么不允许?谷歌C++风格指南是垃圾的…请参阅,但“在构造函数中工作”表示构造函数不应执行诸如打开网络连接之类的操作。@Barmar:请再次参阅Rapptz评论。谷歌有两个专业领域:搜索引擎和广告。这并不能使他们成为C++风格的专家。但是“在构造函数中做工作”则说明构造函数不应该做像开放网络连接之类的事情。@ Barmar:再次,请参见RAPPTZ注释。谷歌有两个专业领域:搜索引擎和广告。这并不能使他们成为C++风格的专家。