27 March 2022

C++ 核心指南目录

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

因为 xy 在不同的编译单元里,f()g() 的调用顺序没有特定的规定标准。其中一个函数会可能会访问到一个没有初始化的 const 变量。这里我们可以看到,初始化顺序问题会出现在全局的对象上,且不仅仅发生在全局变量上,也可能发生在全局常量上。

注意

在并发执行的代码中初始化顺序的问题会更加难处理。最好避免使用全局对象。

强化

  • 标注调用了不是 constexpr 函数的全局对象初始化函数
  • 标注访问 extern 对象的全局对象初始化函数