跨文件的依赖变量之间的初始化顺序是什么?

时间:2013-05-28 01:23:22

标签: c++

假设我有以下代码:

extern std::string first_string; //defined in another file
std::string another_string(first_string + "some other string");

我的问题是:

标准是否保证first_string始终在another_string之前初始化?

如果没有,应该在实践中避免这样的代码吗?

我试图通过阅读C ++标准N3485第3.6节和第3.7节来解决这个问题。但我没有找到一个好的答案。我非常感谢您在起草答案时能够指出我的标准部分。 谢谢你的帮助。

2 个答案:

答案 0 :(得分:5)

订单未定义。

C++ FAQ

  

假设你有两个静态对象x和y,它们分开存在   源文件,比如x.cpp和y.cpp。进一步假设   y对象的初始化(通常是y对象的构造函数)   在x对象上调用一些方法。

     

就是这样。就这么简单。

     

悲剧在于你有50%-50%的死亡几率。如果   x.cpp的编译单元首先被初始化,一切都是   好。但是如果y.cpp的编译单元首先被初始化,   然后y的初始化将在x的初始化之前运行,并且   你敬酒。例如,y的构造函数可以在x上调用方法   对象,但x对象尚未构建。

并查看How do I prevent the "static initialization order fiasco"?

答案 1 :(得分:3)

未定义;比照What's the "static initialization order fiasco"?。标准中的相关部分是§3.6.2“非局部变量的初始化”,即

  

否则,对于在不同翻译单元中定义的变量的初始化,变量的初始化是不确定的。