先看代碼: [cpp] #include <windows.h> #define showdbg(str) \ {\ MessageBoxA(0,#str,"",0);\ }; class A { public: A() { showdbg("fuckme"); } ~A() { showdbg("end"); } void dosth() { showdbg("something"); } }; A a; void main() { a.dosth(); } 如果采用了默認的編譯和鏈接方式,結果是三個消息框。 但是我想看看這個全局對象a,是怎麼初始化的。 編譯: cl /c /EHsc msg.cpp 鏈接: link /entry:main /subsystem:windows /nodefaultlib msg.obj 出現錯誤:提示未找到_atexit 原因猜測,全局對象它並不會無緣無故地在真正的main函數之前自己初始化。它需要利用到crt函數中的atexit注冊某些函數(可能是析構函數) 再使用正常的編譯方法: cl msg.cpp 生成 msg.exe 在調試器中觀察,發現全局對象的初始化過程是這樣的: 在CRT中,msvcrt.dll 調用了鏈接器默認庫(/nodefaultlib)中的_pre_cpp_init函數(這個函數的會被默認編譯進入你的程序)。 just so. 所以書上說的全局對象會在MAIN函數之前自動構造,其實是錯誤的。它不是自動構造的,是CRT幫你做的。