比方说,我们有两个编译单元如下:此代码是否会产生未定义的行为或仅仅是未指定的行为?
// 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标准说是相同的。)