假设我们有两个编译单元,如下所示:
// 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标准也是如此。