CppCoreGuidelines I.22 避免对全局对象进行复杂的初始化
27 March 2022
奇怪,13后面没有14,直接跳到22了。
理由:
复杂的初始化会导致执行顺序的不确定性。
例子:
// file1.c extern const X x; const Y y = f(x); // read x; write y // file2.c extern const Y y; const X x = g(y); // read y; write x
因为 x
和 y
在不同编译单元里, f()
和 g()
的调用顺序不确定。其中一个函数会访问到一个未初始化的 const
。
注意:
在并发执行的代码中初始化顺序的问题会更加难处理。最好避免使用全局对象。
强化:
- 标注调用非
constexpr
函数的全局初始化函数 - 标注访问
extern
对象的全局初始化函数