全局初始值设定项访问 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;
}