我从一本书中读到了SIOF,它举了一个例子: //file1.cpp extern int y; int x=y+1; //file2.cpp extern int x; int y=x+1; 现在我的问题是: 在上面的代码中,会发生下面的事情吗? 当编译file1.cpp时,编译器会保留y,即不为其分配存储空间。 编译器为x分配存储空间,但不会初始化它。 当编译file2.cpp时,编译器会将x保留,即不为其分配存储空间。 编译器为y分配存储空间,但不会初始化它。 当链接file1.o和file2.o时,现在让file2.o被初始化,所以现在: x是否获得0的初始值? 或没有得到初始化?
当我在C ++中使用静态variables时,我经常最终想要初始化一个variables传递给它的构造函数。 换句话说,我想创build相互依赖的静态实例。 在一个.cpp或.h文件中,这不是一个问题:实例将按照它们声明的顺序创build。 但是,如果要用另一个编译单元中的实例初始化静态实例,则该顺序似乎无法指定。 其结果是,根据天气情况,可能发生依赖于另一个的实例被构造,并且仅在之后才构造另一个实例。 结果是第一个实例初始化不正确。 有谁知道如何确保以正确的顺序创build静态对象? 我已经search了很长时间的解决scheme,尝试所有的解决scheme(包括施瓦茨计数器解决scheme),但我开始怀疑是否有一个真正有效的解决scheme。 一个可能性是静态函数成员的技巧: Type& globalObject() { static Type theOneAndOnlyInstance; return theOneAndOnlyInstance; } 的确,这确实有效。 令人遗憾的是,您必须编写globalObject()。MemberFunction()而不是globalObject.MemberFunction(),导致有些令人困惑和不雅的客户端代码。 更新:谢谢你的反应。 遗憾的是,我似乎回答了我自己的问题。 我想我必须学会和它一起生活…
我们遇到了一些静态初始化顺序失败的问题 ,我正在寻找方法来梳理大量的代码,以查找可能的事件。 有关如何有效地做到这一点的任何build议? 编辑:我得到一些如何解决静态初始化顺序问题的好答案,但这不是我的问题。 我想知道如何find这个问题的对象。 埃文的答案在这方面似乎是最好的; 我不认为我们可以使用valgrind,但我们可能有内存分析工具,可以执行类似的function。 这只会在给定的构build中初始化顺序错误的情况下捕获问题,并且顺序可能随着每个构build而改变。 也许有一个静态分析工具可以解决这个问题。 我们的平台是在AIX上运行的IBM XLC / C ++编译器。