警告 C26427

全局初始值设定项访问 extern 对象“symbol”(i.22)

C++ Core Guidelines: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;
}