Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
A globális inicializáló hozzáfér az extern objektum "szimbólumához" (i.22)
C++ alapvető irányelvek: I.22: A globális objektumok összetett inicializálásának elkerülése
A globális objektumok inicializálhatók inkonzisztens vagy meghatározatlan sorrendben, ami azt jelenti, hogy a közöttük fennálló interdependencia kockázatos, ezért kerülendő. Ez az útmutató akkor alkalmazható, ha az inicializálók egy másik objektumra externhivatkoznak.
Megjegyzések
Az objektum akkor minősül objektumnak extern , ha megfelel a következő szabályoknak:
- egy globális változó, amely meghatározóval
externvan megjelölve, vagy egy osztály statikus tagja; - nincs névtelen névtérben;
- nincs megjelölve
const; - A statikus osztálytagok globálisnak minősülnek, így az inicializálóikat is ellenőrzik.
Kódelemzés neve: NO_GLOBAL_INIT_EXTERNS.
példa
Külső verzió ellenőrzése:
// api.cpp
int api_version = API_DEFAULT_VERSION; // Assume it can change at run time, hence non-const.
// client.cpp
extern int api_version;
bool is_legacy_mode = api_version <= API_LEGACY_VERSION; // C26427, also stale value
A külső verzió ellenőrzése megbízhatóbbá tette a következőt:
// api.cpp
int api_version = API_DEFAULT_VERSION; // Assume it can change at run time, hence non-const.
// client.cpp
extern int api_version;
bool is_legacy_mode() noexcept
{
return api_version <= API_LEGACY_VERSION;
}