在依赖性的情况下静态初始化

时间:2011-09-28 14:04:55

标签: c++ static

以下代码是否安全(不保证静态初始化顺序?)。

在某些图书馆:

class A {
    A() : x_ = 0 {
    }

    int add() {
        return ++x_;
    }
};

namespace S {
    static A a_;
}

#define ADD(varname) \
    namespace S { \
        static int v_##varname = a_.add(); \
    } 

宏ADD将在多个地方使用。是否可以保证在任何ADD宏用法的v _ ## varname之前初始化a_?

2 个答案:

答案 0 :(得分:2)

如果您想保证,您的案例有一个常见的伎俩:

namespace S { 

A & getA() {
   static A a; 
   return a;
}

} // namespace S

static int v_name = getA().add();

答案 1 :(得分:0)

仅在相同的翻译单元/源文件中,ADD定义后a_的任何用法都将在a_构建后执行。在任何其他翻译单元(库或应用程序)中,所有投注都在初始化顺序方面都是关闭的。

如果需要,您可以使用其中一种静态本地方法。

请参阅常见问题解答:http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.15