全局对象的初始化不可依赖未初始化的对象
4.9 ID_relyOnExternalObject
全局对象的初始化或构造过程不可依赖在其他源文件中定义的全局对象,也不可依赖在其后面定义的对象。
在不同源文件中定义的全局对象,以及类的静态成员对象,其初始化顺序是不确定的,在同一源文件中定义的对象,排在前面的会先于后面的初始化。为避免产生问题,建议只使用基本类型的常量作为全局对象,且尽量不要使用 extern 关键字。
示例:
extern int i; // Defined in other translate unit
int j = i; // Non-compliant
例中 i 是在其他源文件中定义的对象,j 初始化时无法保证 i 已被正确初始化。
又如:
int foo() {
return 1;
}
extern int x; // Defined after ‘y’
int y = x; // Non-compliant, unspecified
int x = foo();
例中 x 在 y 的后面定义,y 会先于 x 初始化,y 的值是 0 还是 foo 函数的返回值在标准中是未声明的。
依据
ISO/IEC 9899:2011 5.1.2(1)-unspecified
ISO/IEC 14882:2011 3.6.2(2)
ISO/IEC 14882:2011 3.6.2(3)-unspecified
ISO/IEC 14882:2017 6.6.2(3)-unspecified
ISO/IEC 14882:2017 6.6.3(2)