2011-12-02 57 views
12

全局變量按照出現在翻譯模塊中的順序進行初始化,並且在未指定的不同翻譯模塊(所謂的「靜態初始化順序失敗」)中初始化變量的相對順序。名稱空間是否會影響C++中的初始化順序?

名稱空間對此有影響嗎?例如,如果我有這樣的代碼:

//first.cpp 
int first; 
int second; 

這會對相比,這段代碼初始化順序有什麼區別:

//second.cpp 
namespace { 
int first; 
} 
int second; 

是否存在情況下,把一個全局對象到一個命名空間會影響初始化順序?

+1

請注意,C++標準定義了全局名稱只是出現在全局範圍([basic.scope.namespace]/3)中的名稱。所以就C++而言,在second.cpp中,「first」不是全局的。顯然,對於所有實際目的而言,與所有編程語言中使用的「全局變量」和特別可變的「全局變量」是PITA一起使用的,它是一個「全局」變量。 –

回答

11

3.6其他具有靜態存儲持續時間的非局部變量有序初始化。在單個翻譯單元中定義有序初始化的變量 應按翻譯單元中其 定義的順序進行初始化。

命名空間對此沒有影響 - 本節未提及。

什麼影響順序是不同的翻譯單位。如果您需要在它們之間定義順序,請使用擴展名,例如GCC的constructor屬性。

+0

而不是使用擴展來控制順序,我會建議完全避免依賴。 –

+0

@DavidRodríguez-dribeas更好,避免靜態存儲。 – Pubby

5

那麼,「全局變量按照出現在翻譯模塊中的順序進行初始化」是明確的。它不會留下任何其他空間,如名稱空間,以影響訂單。

實際上,「全局變量按順序初始化」是標準的不精確的引用,因爲正式的錯誤。從C++標準,ISO/IEC 14882的確切措辭:2003,3.6.2第1段是:

與命名空間範圍限定在相同的翻譯 單元和動態初始化靜態存儲持續時間的對象將在被初始化其定義出現在翻譯單元中的順序。

因此,而不是「全局」它說:「具有靜態存儲」,這是所有非本地變量,無論是全球性的,命名空間的成員或類成員,以及他們是否被宣佈static與否。

此外,它增加了「和動態初始化」。帶有簡單構造函數和常量初始化函數的變量總是首先被初始化(通過簡單地從二進制文件中加載它們的值),並且評估所有非常量初始化函數,並按照該順序運行非平凡構造函數。這很重要,所以你可以在這些構造函數中可靠地創建一個鏈表;如果它的頭是純指針,它已經被初始化,所以你可以安全地使用它。

+0

+1爲強調:「全局變量」按照出現在翻譯模塊中的順序進行初始化「is definite」。故事結局! – Nawaz

+0

僅限於「明確」的句子,影響全局變量。用戶定義的命名空間中的東西不是全局的 –

+0

@ JohannesSchaub-litb:是的,它們是全球性的。您迫使我在規範中查看確切的措詞。好的,來... ...(見編輯)。 –

相關問題