2

a.cpp

static Foo fooobj;
void Usefoo()
{
    foooobj.somefunc();
}

b.cpp

static Bar barobj;

这是构造函数Bar

 Bar::Bar()
 {
     Usefoo();
 }

这会导致静态初始化订单惨败吗?如果是,我该如何解决。我想到了下面的东西:

Foo* GetFoo*()
{
    static Foo *fooobj = new Foo();
    return fooobj;
}

但由于我不支持 C++11,静态本地初始化不是线程安全的。因此,这是行不通的。

另外如果barobj是非静态的怎么办。那我就不用担心这场惨败了吧?对于依赖于不同翻译单元中的另一个非静态对象初始化的非静态对象初始化来说,这不是问题。对?

4

1 回答 1

3

这会导致静态初始化订单惨败吗?

是的。

我想到了下面的东西:

通常你会避免指针并做得很好:

Foo& GetFoo()
{
    static Foo fooobj;
    return fooobj;
}

但由于我不支持 C++11,静态本地初始化不是线程安全的。

好吧,那还是有问题的。

另外,如果 barobj 是非静态的怎么办。那我就不用担心这场惨败了吧?

对。您应该避免使用这些全局变量。事实上,这是我们为什么要避免使用全局变量的一个很好的例子。

将您的状态封装到一个不错的类中,可能会main根据需要进行实例化和传递。

对于依赖于不同翻译单元中的另一个非静态对象初始化的非静态对象初始化来说,这不是问题。对?

对。除非你的程序有未定义的行为,否则我想不出办法来打破它。

于 2019-12-11T10:35:53.733 回答