2010-10-09 294 views
4

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

回答

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适用于或等同的。或者在多线程程序中,您可以在创建任何额外的线程之前调用该函数。

+0

由于他没有提到它,我会说线程问题是50/50,因为大多数人都是Windows或gcc。只有那些勇敢的,被迫的人或知道他们现在所做的事情比现在更勇敢的人。由于gcc覆盖了这个问题,所以只有dev studio用户有问题。 – 2010-10-10 00:40:39

1

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

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

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

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