Napotkane ostatnio zapytanie o porządek inicjalizacji statycznej C++ podczas przeglądu kodu.Czy inicjalizacja elementu statycznego klasy jest gwarantowana przed inicjalizacją statycznego obiektu tej klasy?
- mam klasę ze statycznej zmiennej składowej w jednostce kompilacji
- mam statyczny obiekt tej klasy przy użyciu konstruktora w innej jednostce kompilacji
Tutaj chcę wiedzieć, czy statyczna zmienna składowa ma być zainicjowana przed wywołaniem statycznego konstruktora obiektów?
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);
W kodzie, by mFunc
być inicjowane nullptr
przed myClassObj
zostanie stworzony? Powodem zapytania jest to, że jeśli zamówienie nie jest gwarantowane, wówczas mFunc
może zostać ponownie zainicjowane na nullptr
.
Nie ma powodu, aby tolerować nieznane, ani pozostawić tego linkowi. Po prostu upewnij się, że sekwencja używa jawnego kodu na początku w main(). –