依赖关系时的静态初始化

发布于 2024-12-07 10:16:11 字数 345 浏览 0 评论 0原文

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

在某些库中:

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

海拔太高太耀眼 2024-12-14 10:16:11

如果你想保证的话,有一个适合你的情况的常见技巧:

namespace S { 

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

} // namespace S

并且

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

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();
野侃 2024-12-14 10:16:11

仅在同一翻译单元/源文件中,在 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 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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文