コードレビューでこの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:myClassObj
が作成される前にコードで
static MyClass myClassObj(MyDifferentClass::MyStaticFunc);
は、mFunc
nullptr
に初期化されるだろうか?クエリの理由は、注文が保証されていない場合、mFunc
がnullptr
に再び初期化される可能性があるためです。コードで
不明な部分を許容する理由はなく、これをリンカーに任せることもできません。 main()の早い段階で明示的なコードを使ってシーケンスを保証するだけです。 –