gpt4 book ai didi

c++ - 调用另一个翻译单元的功能可能导致静态初始化顺序惨败

转载 作者:行者123 更新时间:2023-12-01 14:43:53 25 4
gpt4 key购买 nike

cpp文件

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

cpp文件
static Bar barobj;

这是 Bar的构造函数
 Bar::Bar()
{
Usefoo();
}

这会导致静态初始化命令惨败吗?
如果是,我该如何解决。我想到了以下内容:
Foo* GetFoo*()
{
static Foo *fooobj = new Foo();
return fooobj;
}

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

如果 barobj是非静态的,也会怎样。那我不必担心这种惨败吧?对于依赖于不同转换单元中的另一个非静态对象初始化的非静态对象初始化,这不是问题。对?

最佳答案

Will this lead to static initialization order fiasco?



是。

I thought of something like below:



通常,您会避免使用指针并做一个不错的事情:
Foo& GetFoo()
{
static Foo fooobj;
return fooobj;
}

But since I don't have support of C++11, static local initialization is not thread safe.



好吧,那还是有问题的。

Also what if barobj was non-static. Then I don't have to worry about this fiasco right?



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

将您的状态封装到一个不错的类中,也许可以在 main中实例化,然后根据需要传递。

For a non-static object initialization which is depending on another non-static object initialization in a different translation unit is not an issue. Right?



对。除非您的程序具有未定义的行为,否则我想不出一种解决方法。

关于c++ - 调用另一个翻译单元的功能可能导致静态初始化顺序惨败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59283472/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com