2016-07-01 32 views
0

我读this,我想不出这X::_x将被用来初始化文件X.cpp前(假设编译器将X.h和其他后X.cpp一个)一个场景的C++静态初始化命令失败发生在什么时候?

有人能向我解释如何这样的场景可能发生?当你有多个翻译单元*使用静态初始化,程序需要由另外一个产生的数据初始化的一个

+0

当您有多个翻译单元时可能会发生这种情况。 – drescherjm

+0

您是否阅读过该FAQ的[10.14](http://www.cs.technion.ac.il/users/yechiel/c++-faq/static-init-order.html)? –

回答

5

静态初始化顺序的悲剧发生。

如果你只有一个头和一个单独的翻译单元,静态初始化命令失败不适用,因为initialization order within the same unit is well defined(它遵循声明的顺序)。

*这是cpp文件的花哨名称。

+0

这不是由一次编译运行创建的对象,例如'g ++ -c a.cc b.cc -o ab.o'会给单个翻译单元? –

+1

@ W.F .:不,这是两个翻译单元。我猜g ++会把它们写到同一个.o文件中,第二个是第一个。根据文档,“由于只能指定一个输出文件,因此编译多个输入文件时使用-o是没有意义的,除非您生成可执行文件作为输出。” –

+0

@ W.F。如果您一次编译两个cc文件,则无关紧要:从C++标准的角度来看,每个cc文件都被视为单独的翻译单元。 – dasblinkenlight

0

我认为只有页面上的代码才能发生,但是可能会有更多的代码,其行为与页面上描述的相同。在这些文件中的一个,一个可以有X类型的静态对象:

// File X3.cpp 
#include "X.h" 

X x__; 

现在,如果:

  • 类X的默认构造函数调用的someMethod

    // File X2.cpp 
    
    X::X() { 
        someMethod(); 
    } 
    

and

    (因为两者都是静态对象在不同的​​cpp文件的顺序是不确定的,其可能会或可能不会发生,)

然后X_被初始化之前的someMethod()将被称为

  • X__是X_之前进行初始化。