程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> c++全局對象的構造時機 by Mr.瑞

c++全局對象的構造時機 by Mr.瑞

編輯:C++入門知識

先看代碼: [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幫你做的。    

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved