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用户有问题。