共用方式為


警告 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;
}