我最近在代碼審查中遇到了這個與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()的早期使用顯式代碼來確保序列。 –