【问题标题】:Request for the detailed description of "Static Initialization Order Fiasco"索取“静态初始化命令惨败”的详细说明
【发布时间】:2011-06-11 11:42:44
【问题描述】:

我在 faq-lite 中阅读了有关 SIOF 的信息,但我仍然不明白为什么会出现此问题。我有一个静态库(.a),我使用该库来使用它的静态 const 数据成员对象类型。然后我使用并分配给全局变量(对象)的静态 const 数据成员对象类型。但是,当我将全局变量用于我的主函数或任何本地函数时,全局变量似乎是空的。我显然知道我的问题是 SIOF,但我真的不明白为什么我的静态 const 数据成员对象没有被初始化。

它是静态库,所以我猜当我们创建静态库时,静态 const 数据成员对象已编译并链接到该静态库,如果我错了,请纠正我..

//libsource.h
class foo
{
   public:
   ....

   public:
   static const barbar foofaa;
};

//libsource.cpp
const barbar foo::foofaa = barbar();

//main.cpp
#include <libsource.h>

barbar foos= foo::foofaa;

int main()
{
   //can't use foos because its empty
}

请指教。为什么即使静态库中的静态 const 数据成员对象也没有初始化?

非常感谢。

【问题讨论】:

    标签: c++ static-initializer


    【解决方案1】:

    静态初始化顺序惨败相当简单:单个翻译单元中的静态对象按照它们声明的顺序进行初始化,但不能保证不同翻译单元中的静态对象的初始化顺序互相尊重。

    因此,在您的具体示例中,main.cpp 中的foos 可能在foo::foofaa 之前初始化,libsource.cpp 中声明了它。

    【讨论】:

    • 您好,谢谢。初始化部分对我来说真的很模糊。为什么需要初始化静态数据成员?当我们编译和链接以创建静态库时,它是否已经初始化?请指教。谢谢
    • @sasayins:静态变量在您运行程序之前不会被初始化。它们不是在您的静态库中等待使用的“预初始化”。因此,当您的程序开始时(在调用 main() 之前),它会初始化每个库中的 all 静态变量。
    • @JaredC:更准确地说,一些静态变量在编译或链接时预初始化,但其他(非平凡的)通常需要运行时初始化。编译器通常为它构建的每个对象创建一个初始化函数,然后在 main() 启动之前调用它们,但问题是调用这些初始化函数的顺序可能不是您的程序需要的。事实上,如果你有循环依赖,那么哪个先运行可能并不重要——它仍然会被破坏。 FAQ lite 继续提供一些解决方法....
    猜你喜欢
    • 2011-07-15
    • 2015-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多