C++静态初始化顺序

2024-01-11

当我在 C++ 中使用静态变量时,我经常最终想要初始化一个变量,并将另一个变量传递给其构造函数。换句话说,我想创建相互依赖的静态实例。

在单个 .cpp 或 .h 文件中,这不是问题:实例将按照声明的顺序创建。但是,当您想用另一个编译单元中的实例初始化静态实例时,顺序似乎无法指定。结果是,根据天气情况,可能会发生依赖于另一个实例的实例被构建,然后另一个实例才被构建的情况。结果是第一个实例初始化不正确。

有谁知道如何确保静态对象以正确的顺序创建?我已经寻找了很长时间的解决方案,尝试了所有的解决方案(包括 Schwarz Counter 解决方案),但我开始怀疑是否有一个真正有效。

一种可能性是静态函数成员的技巧:

Type& globalObject()
{
    static Type theOneAndOnlyInstance;
    return theOneAndOnlyInstance;
}

确实,这确实有效。遗憾的是,您必须编写 globalObject().MemberFunction(),而不是 globalObject.MemberFunction(),从而导致客户端代码有些混乱和不优雅。

Update:感谢您的反应。遗憾的是,我似乎确实回答了我自己的问题。我想我必须学会忍受它......


你已经回答了你自己的问题。静态初始化顺序是未定义的,最优雅的方法(同时仍然进行静态初始化,即不完全重构它)是将初始化包装在函数中。

阅读 C++ 常见问题解答项目,从https://isocpp.org/wiki/faq/ctors#static-init-order https://isocpp.org/wiki/faq/ctors#static-init-order

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++静态初始化顺序 的相关文章

随机推荐