初始化静态变量

时间:2010-10-09 23:23:01

标签: c++

我刚刚读到,如果我想确定初始化顺序,最好使用一些将全局变量转换为本地(但仍然是静态)的函数,我的问题是,我是否需要保留一些标识符这告诉我我的静态对象已经被创建(函数内部的标识符阻止我再次初始化static object)?因为我可以在不同的地方使用此功能进行初始化,提前感谢任何帮助

2 个答案:

答案 0 :(得分:1)

第一个问题是静态生命周期对象是否关心它们的初始化顺序?

如果是,那么第二个问题是为什么?

如果全局对象在初始化期间使用另一个全局对象(即构造函数正在运行时),则初始化只是一个问题。注意:这是可怕的主动,应该避免(不应该使用全局变量,如果它们应该是相互依赖的)。

如果它们必须被链接,那么它们应该是相关的(在这种情况下,您可能会创建一个包含两个旧对象的新对象,以便您可以更精确地控制它们的创建)。如果那是不可能的,你只需将它们放在同一个编译单元中(读* .cpp文件)。

答案 1 :(得分:0)

就标准而言,函数范围静态变量的初始化只发生一次:

int *gettheint(bool set_to_four) {
    static int foo = 3; // only happens once, ever
    if (set_to_four) {
        foo = 4;   // happens as many times as the function is called with true
    }
    return &foo;
}

因此gettheint无需检查foo是否已初始化 - 在第二次及以后的调用中,3不会覆盖该值。

线程在工作中抛出一个扳手,超出了标准的范围。您可以查看有关线程实现的文档,但可能是初始化的初始化在您的实现中不是线程安全的。这就是pthread_once的用途或等价物。或者在多线程程序中,您可以在创建任何额外线程之前调用该函数。

相关问题