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 extern
kabul 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
const
iş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;
}