static initialization in case of dependencies
Is the following code safe (given no guarantees of static initialization order?).
In some library:
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(); \
}
Macro ADD will be used at multiple places. Is it guaranteed that a_ wi开发者_开发技巧ll be initialized before v_##varname for any ADD macro usage?
There is a common trick for your case if you want to guarantee:
namespace S {
A & getA() {
static A a;
return a;
}
} // namespace S
And
static int v_name = getA().add();
In the same translation unit/source file only, any uses of ADD after the definition of a_ will be executed after a_ is constructed. In any other translation unit (library or application) all bets are off in terms of ordering of initialization.
You can use one of the static local methods if needed.
See the FAQ: http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.15
加载中,请稍侯......
精彩评论