以下代码是否安全(不保证静态初始化顺序?)。
在某些图书馆:
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_?
答案 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