静态变量在同一个翻译单元中被静态方法使用时是否保证被初始化?

Is static variable guaranteed to be initialized when used by static methods in the same translation unit?

本文关键字:是否 初始化 静态方法 变量 同一个 翻译 单元 静态      更新时间:2023-10-16

我读到,如果静态全局变量在同一个翻译单元中,则静态全局变量的动态初始化保证按定义顺序进行。然后我想知道当静态全局变量由同一翻译单元中定义的静态方法使用时,是否可以保证静态全局变量必须进行动态初始化。

//Foo.h
class Foo
{
public:
Foo(int i) {m_i = i;}
int m_i;
};
//X.h
class X
{
static void doSth();
static Foo foo;
};
//X.cpp
Foo X::foo(2);
void X::doSth()
{
//Is it guaranteed that foo has been properly initialized here?
std::cout << foo.m_i << std::endl;
}

简短回答:不,全局初始化与静态方法无关。

下面是一个简单的场景来说明原因:如果Foo的构造函数调用了doSth()怎么办?

如果需要该保证,则需要使用函数范围的静态变量。