C++ 静态变量的初始化

C++ 静态变量的初始化,c++,C++,我刚刚读到,如果我想确定初始化顺序,最好使用一些函数将全局变量转换为局部变量(但仍然是静态的),我的问题是,我是否需要保留一些标识符,告诉我静态对象已经创建(阻止我再次初始化静态对象的函数中的标识符)或否?因为我可以在不同的位置使用此函数进行初始化,提前感谢所有帮助就标准而言,函数范围静态变量的初始化只发生一次: int *gettheint(bool set_to_four) { static int foo = 3; // only happens once, ever if

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

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

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\u once
的用途,或者是等效的您可以在创建任何额外线程之前调用该函数。

第一个问题是,您的静态生存期对象是否关心它们的初始化顺序

如果是真的,第二个问题是为什么

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


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

既然他没有提到,我想说线程问题是50/50,因为大多数人都是windows或gcc。只有勇敢和被迫的人,或者知道自己在做什么的人比现在更勇敢。因为gcc涵盖了这个问题,所以只有dev studio用户有问题。