2012-09-07 211 views
4

C++ 03標準[basic.start.init]點3種狀態:動態初始化

它實現定義是否動態 初始化(8.5,9.4,12.1,12.6。 1)名稱空間 作用域的對象在main的第一個語句之前完成。如果 初始化被推遲到main的第一個 聲明之後的某個時間點,它應該在第一次使用任何 函數或對象的同一個翻譯單元中定義的對象被初始化之前發生。

根據Additional Startup Considerations,微軟編譯器在執行初始化操作之前,先執行main()

我一直無法獲得說明GNU和Sun Forte編譯器行爲的文檔。

任何人都可以:

  1. 點我的文檔描述了GNU和Forte編譯器相對於動態初始化的行爲方向(我檢查了GCC手冊,發現與動態初始化沒有) 。
  2. 關於延遲動態初始化的線程安全性(如果兩個線程試圖從包含非本地對象的相同翻譯單元調用函數)的註釋。

FWIW,我觀察到的GNU的g ++以及SUN的CC的行爲,兩者的表現之前,主要的initalization雖然我不接受這是一個明確的答案。 (我可以張貼在非常簡單的代碼我用來觀察如果有人有興趣,但我覺得這個問題是足夠長

+1

動態庫有一個例外,其中初始化可能在加載時執行,即使這是在main()的第一個語句之後。 –

+1

這是一個非常有趣的問題:如果你說'std :: ostream&o =(std :: cout <<「Hello \ n」); int main(){std :: cout <<「World \ n」; },按照哪個順序打印這些行? –

+1

@KerrekSB在這種情況下,不存在歧義,因爲初始化必須在調用翻譯單元中的第一個函數之前發生。 –

回答

5

明確的答案是,所有的編譯器main之前做靜態初始化 ,除非對象在稍後加載的DLL中。 實際上,(幾乎)不可能滿足您另外引用的 文本中的要求。 (想想如果有一個循環會發生什麼)