CppCoreGuidelines I.22 避免对全局对象进行复杂的初始化
27 March 2022
I.22: Avoid complex initialization of global objects
理由
语言标准对复杂的初始化过程的执行顺序没有进行规定。
例子
// 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
对象的全局对象初始化函数