我可以在C++中更改静态变量初始化顺序吗?

P-P*_*P-P 15 c++ pragma static-variables visual-studio visual-studio-2015

我在Visual Studio 2015 sp3中使用C++.通过

#pragma init_seg(compiler)
Run Code Online (Sandbox Code Playgroud)

,我首先初始化一些静态变量(到内存管理). https://msdn.microsoft.com/en-us/library/7977wcck.aspx

但是还有

#pragma init_seg(compiler)
Run Code Online (Sandbox Code Playgroud)

在wcerr.cpp(Microsoft Visual Studio 14.0\VC\crt\src\stl\wcerr.cpp)中,所以这些对象在我的对象之前初始化.

我可以wcerr.cpp通过任何编译/链接选项强制我的对象在对象之前被初始化吗?

Tro*_*iar 13

解决方案之一是尝试将静态变量包装到静态函数:

static type& My_static_obj() {
    static type my_static_obj_;
    return my_static_obj_;
}
Run Code Online (Sandbox Code Playgroud)

它看起来像一个简单的Singleton类型,并调用Construct On First Use Idiom.由于标准(C++ 11及以上版本),它保证初始化一次(甚至原子化!),并且在其c-tor内部,这样的对象可以访问其他"静态"变量,因此,如果没有圆形变量之间的依赖关系,将严格定义初始化的顺序.

有关其他信息,请参阅此问题以及此"首次使用构造"构造的其他说明.