假设我们有两个编译单元,如下所示:
// a.cpp
extern int value2;
int value1 = value2 + 10;
// b.cpp
extern int value1;
int value2 = value1 + 10;
当我在 VC2010 上尝试它时,它首先初始化value1
并value2
归零。两者都不是动态初始化的value1
,value2
默认初始化不适用于它们吗?
谢谢,
假设我们有两个编译单元,如下所示:
// a.cpp
extern int value2;
int value1 = value2 + 10;
// b.cpp
extern int value1;
int value2 = value1 + 10;
当我在 VC2010 上尝试它时,它首先初始化value1
并value2
归零。两者都不是动态初始化的value1
,value2
默认初始化不适用于它们吗?
谢谢,
3.6.2/1 说“在任何其他初始化发生之前,具有静态存储持续时间 (3.7.1) 的对象应进行零初始化 (8.5)”。
所以你是对的,它们不是默认初始化的。但是它们是零初始化的,这实际上int
是一回事。对于类类型,它不一定是同一件事。
也就是说,我不承诺这里的行为仅仅是未指定初始化的顺序,因此一个变量最终为 10,另一个为 20,但未指定哪个是哪个。由于其他原因,它可能是未定义的,但我想不出任何理由。
在所有其他初始化发生之前,每个全局变量首先进行零初始化。
此行为描述3.6.2 [basic.start.init] / 2
如下:
具有静态存储持续时间或线程存储持续时间的变量应在任何其他初始化发生之前进行零初始化。
(这是来自 C++0x FDIS,但我相信 C++98 标准也这么说。)