我读this,我想不出这X::_x
将被用来初始化文件X.cpp
前(假设编译器将X.h
和其他后X.cpp
一个)一个场景的C++静态初始化命令失败发生在什么时候?
有人能向我解释如何这样的场景可能发生?当你有多个翻译单元*使用静态初始化,程序需要由另外一个产生的数据初始化的一个
我读this,我想不出这X::_x
将被用来初始化文件X.cpp
前(假设编译器将X.h
和其他后X.cpp
一个)一个场景的C++静态初始化命令失败发生在什么时候?
有人能向我解释如何这样的场景可能发生?当你有多个翻译单元*使用静态初始化,程序需要由另外一个产生的数据初始化的一个
静态初始化顺序的悲剧发生。
如果你只有一个头和一个单独的翻译单元,静态初始化命令失败不适用,因为initialization order within the same unit is well defined(它遵循声明的顺序)。
*这是cpp文件的花哨名称。
这不是由一次编译运行创建的对象,例如'g ++ -c a.cc b.cc -o ab.o'会给单个翻译单元? –
@ W.F .:不,这是两个翻译单元。我猜g ++会把它们写到同一个.o文件中,第二个是第一个。根据文档,“由于只能指定一个输出文件,因此编译多个输入文件时使用-o是没有意义的,除非您生成可执行文件作为输出。” –
@ W.F。如果您一次编译两个cc文件,则无关紧要:从C++标准的角度来看,每个cc文件都被视为单独的翻译单元。 – dasblinkenlight
我认为只有页面上的代码才能发生,但是可能会有更多的代码,其行为与页面上描述的相同。在这些文件中的一个,一个可以有X类型的静态对象:
// File X3.cpp
#include "X.h"
X x__;
现在,如果:
类X的默认构造函数调用的someMethod
// File X2.cpp
X::X() {
someMethod();
}
and
然后X_被初始化之前的someMethod()将被称为
当您有多个翻译单元时可能会发生这种情况。 – drescherjm
您是否阅读过该FAQ的[10.14](http://www.cs.technion.ac.il/users/yechiel/c++-faq/static-init-order.html)? –