Megosztás:


Figyelmeztetés C26427

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 extern van 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;
}