標籤:

c/c++ 在執行main之前做了哪些事情?例如全局變數初始化,越詳細越好。


編譯器經常需要在用戶定義的入口函數(通常叫做main)之前加入代碼以保證對標準的兼容性,比如具有靜態存儲生命期對象的初始化,或者從操作系統獲得命令行參數。這意味著編譯器需要提供一個操作系統級別的入口函數。對於Visual C++,這個入口是mainCRTStartup/_WinMainCRTStartup。一些其他的編譯器用_start做入口函數的名字。

入口函數具體做了什麼各個編譯器不同。一些特定編譯器的功能,比如對緩衝區溢出的檢測,也需要在入口函數里初始化。一些編譯器提供標準庫的源代碼,你可以單步調試入口函數來了解具體入口函數的功能。

不需要兼容標準的時候(比如一些針對嵌入式系統的編譯器有"non-ISO compliant startup"這個選項),或者是C程序的話,用戶定義的入口函數可以就是操作系統看到的入口函數,這意味著入口函數之前可以沒有代碼執行。


vs安裝的時候可以選擇安裝crt的源代碼,強烈推薦安裝

vs里需要在設置,調試里設置好符號文件的路徑

然後你可以寫個最簡單的main,調試進main,然後就可以在堆棧窗口裡看到main前的情況,雙擊可以看到之前的調用

其實我覺得調試方法特別重要,那麼多的文章,竟然沒人介紹crt和符號文件,導致不需要問的問題卻反覆有人問


圖已補!


推薦閱讀:

TAG:彙編語言 | CC |