我最近在代码审查中遇到了这个与C++静态初始化相关的查询。初始化该类的静态对象的初始化之前是否保证了类的静态成员的初始化?
- 我和静态成员变量类编译单元
- 我在不同的编译单元
这里使用一个构造函数,类的静态对象,我想知道静态成员变量是否保证在静态对象构造函数被调用之前被初始化?
MyClass.h:
typedef int (*MyFunc)(int);
class MyClass {
MyClass(MyFunc fptr) {
mFunc = fptr;
}
static MyFunc mFunc;
}
MyClass.cpp:
MyFunc MyClass::mFunc = nullptr;
MyDifferentClass.h:
MyDifferentClass {
public:
static int MyStaticFunc(int);
}
MyDifferentClass.cpp:
static MyClass myClassObj(MyDifferentClass::MyStaticFunc);
在代码中,将mFunc
被初始化为nullptr
myClassObj
之前被创造出来的?查询的原因是,如果订单不能保证,那么mFunc
可能会重新初始化为nullptr
。
没有理由容忍未知,也不会将其留给链接器。只需在main()的早期使用显式代码来确保序列。 –