C ++静态初始化命令惨败发生的时候?

时间:2016-07-01 14:54:21

标签: c++ static

我读了this,我想不出在文件X::_x中初始化之前将使用X.cpp的情况(假设编译器处理X.h和{ {1}}一个接一个地)

有人可以向我解释这种情况会怎样吗?

2 个答案:

答案 0 :(得分:5)

如果有多个使用静态初始化的转换单元 * ,则会发生静态初始化顺序失败,其中一个初始化例程需要另一个生成的数据。

如果您拥有的是单个标头和单个翻译单元,则静态初始化顺序fiasco不适用,因为initialization order within the same unit is well defined(它遵循声明的顺序)。

* 这是一个cpp文件的奇特名称。

答案 1 :(得分:0)

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

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

X x__;

现在,如果:

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

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

  • x__在x_之前初始化(可能会也可能不会发生,因为两个都是不同cpp文件中的静态对象,订单是未定义的)

然后在x_初始化之前调用someMethod()。