比方說,我們有兩個編譯單元如下:此代碼是否會產生未定義的行爲或僅僅是未指定的行爲?
// 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標準說是相同的。)