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編譯器行爲的文檔。
任何人都可以:
- 點我的文檔描述了GNU和Forte編譯器相對於動態初始化的行爲方向(我檢查了GCC手冊,發現與動態初始化沒有) 。
- 關於延遲動態初始化的線程安全性(如果兩個線程試圖從包含非本地對象的相同翻譯單元調用函數)的註釋。
FWIW,我觀察到的GNU的g ++以及SUN的CC的行爲,兩者的表現之前,主要的initalization雖然我不接受這是一個明確的答案。 (我可以張貼在非常簡單的代碼我用來觀察如果有人有興趣,但我覺得這個問題是足夠長)
動態庫有一個例外,其中初始化可能在加載時執行,即使這是在main()的第一個語句之後。 –
這是一個非常有趣的問題:如果你說'std :: ostream&o =(std :: cout <<「Hello \ n」); int main(){std :: cout <<「World \ n」; },按照哪個順序打印這些行? –
@KerrekSB在這種情況下,不存在歧義,因爲初始化必須在調用翻譯單元中的第一個函數之前發生。 –