依赖关系时的静态初始化
以下代码安全吗(不保证静态初始化顺序?)。
在某些库中:
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 宏使用,是否保证 a_ 将在 v_##varname 之前初始化?
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_ will be initialized before v_##varname for any ADD macro usage?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
如果你想保证的话,有一个适合你的情况的常见技巧:
并且
There is a common trick for your case if you want to guarantee:
And
仅在同一翻译单元/源文件中,在
a_
定义之后使用ADD
将在a_
之后执行代码>已构建。在任何其他翻译单元(库或应用程序)中,所有的赌注都取决于初始化的顺序。如果需要,您可以使用静态本地方法之一。
请参阅常见问题解答:http://www.parashift.com/c++ -faq-lite/ctors.html#faq-10.15
In the same translation unit/source file only, any uses of
ADD
after the definition ofa_
will be executed aftera_
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