警告 C26427
全域初始化運算式會存取 extern 物件 ' symbol ' (i.22)
C++ 核心指導方針 : I.22 :避免複雜的全域物件初始化
全域物件可能以不一致或未定義的順序初始化,這表示它們之間的相互依賴性是有風險的,因此應該避免。 當初始化運算式參考另一個被視為 extern
的物件時,適用此指導方針。
備註
如果物件符合下列規則,就會被視為 extern
物件:
- 它是以
extern
規範標示的全域變數,或是類別的靜態成員; - 它不在匿名命名空間中;
- 它未標示為
const
; - 靜態類別成員會視為全域,因此也會檢查其初始化運算式。
程式碼分析名稱: NO_GLOBAL_INIT_EXTERNS
範例
外部版本檢查:
// 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
外部版本檢查更可靠:
// 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;
}