Aracılığıyla paylaş


Uyarı C26427

Genel başlatıcı 'symbol' extern nesnesine erişiyor (i.22)

C++ Temel Yönergeleri: I.22: Genel nesnelerin karmaşık bir şekilde başlatılmasını önle

Genel nesneler tutarsız veya tanımsız bir sırada başlatılabilir, bu da aralarındaki bağımlılıkların riskli olduğu ve kaçınılması gerektiği anlamına gelir. Bu kılavuz, başlatıcılar olarak externkabul edilen başka bir nesneye başvurduğunda geçerlidir.

Açıklamalar

Bir nesne aşağıdaki kurallara uygunsa kabul edilir extern :

  • tanımlayıcı ile extern işaretlenmiş genel bir değişkendir veya bir sınıfın statik üyesidir;
  • anonim ad alanında değildir;
  • olarak constişaretlenmez;
  • Statik sınıf üyeleri genel olarak kabul edilir, bu nedenle başlatıcıları da denetlenür.

Kod analizi adı: NO_GLOBAL_INIT_EXTERNS

Örnek

Dış sürüm denetimi:

// 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

Dış sürüm denetimi daha güvenilir hale getirildi:

// 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;
}