防止静态初始化命令"fiasco",C++

Edu*_*yan 9 c++ static word-wrap static-initialization static-order-fiasco

有一次,我在读一个真棒C++ FAQ(这是真的好!)并阅读主题如何防止静态初始化命令"惨败".因此作者建议将静态变量包装到函数中,从而通过维护变量的创建顺序来防止"惨败".但在我看来,这是一个粗鲁的解决方法.所以我的问题是,是否有任何现代的,更多的模式导向的方法来防止这种"惨败",但将"静态东西"包装成函数???

Lig*_*ica 14

现代的,更注重模式的方式不是首先使用全局变量.

除此之外别无他法.

它不会是一个"惨败",否则!

  • @jww 有这个问题的代码有严重的相互依赖问题,应该重构。 (3认同)

utn*_*tim 7

所以我的问题是,是否有任何现代的、更面向模式的方法来防止这种“惨败”,而是将“静态内容”包装到函数中???

在大多数情况下,您可以在主函数中声明“全局”数据,并在需要时使用依赖项注入来传递它。换句话说,根本没有静态。

在实践中,您可能会遇到需要静态数据的情况。如果不依赖于其他静态数据,则将数据设为静态数据const/constexpr

// smart pointer that implements the "Foo" release policy
class FooPointer
{
    static const FooPointer NullFoo; // does not depend on other static values
    /* ... */
};
Run Code Online (Sandbox Code Playgroud)

如果静态变量确实相互依赖,只需将它们包装在静态函数中:

// smart pointer that implements the "Foo" release policy
class FooPointer
{
    static const FooPointer& NullFoo(); // depends on other static values
    /* ... */
};
Run Code Online (Sandbox Code Playgroud)

总结一下:

大多数(90%?99%?)静态/全局/共享数据应该依赖注入到使用它的地方,而不是创建为静态的。

在极少数情况下,当出于某种原因需要静态变量并且它们不依赖于其他静态变量时,请声明静态变量。

少数情况下,当静态需要静态并且它们相互依赖时,请在静态方法中对它们进行wap。

根据经验,如果你有很多第二种和第三种情况,那么你对第一种情况做得还不够。