分類: [c++]
2013-01-25 14:56
1480人閱讀收藏
舉報
一、main結束 不代表整個程序結束
(1)全域性物件的建構函式會在main 函式之前執行,
全域性物件的析構函式會在main函式之後執行;
用atexit註冊的函式也會在main之後執行。
(2)一些全域性變數、物件和靜態變數、物件的空間分配和賦初值就是在執行main函式之前,而main函式執行完後,還要去執行一些諸如釋放空間、釋放資源使用權等操作
(3)程序啟動後,要執行一些初始化**(如設定環境變數等),然後跳轉到main執行。全域性物件的構造也在main之前。
二、main()之後執行的**,用atexit註冊的函式也會在main之後執行
[cpp]view plain
copy
print?
#include
void fn1(void)
void fn2(void)
void fn3(void)
void fn4(void)
int main(void)
關於atexit函式我的稍微補充一下,原型如下:
[cpp]view plain
copy
print?
int atexit(void (*func)(void));
atexit 函式是標準 c 新增的。它「註冊」乙個函式,使這個函式將在 exit 函式被呼叫時或者當 mian 函式返回時被呼叫。當程式異常終止時(例如呼叫 abort 或 raise),通過它註冊的函式並不會被呼叫。編譯器必須至少允許程式設計師註冊32個函式。如果註冊成功,atexit 返回0,否則返回非零值。沒有辦法取消乙個函式的註冊。在 exit 所執行的任何標準清理操作之前,被註冊的函式按照與註冊順序相反的順序被依次呼叫。每個被呼叫的函式不接受任何引數,並且返回型別是 void。被註冊的函式不應該試圖引用任何儲存類別為 auto 或 register 的物件(例如通過指標),除非是它自己所定義的。多次註冊同乙個函式將導致這個函式被多次呼叫。有些傳統 c 編譯器用 onexit 這個名稱實現了像是的功能。
atexit是註冊後進先出的函式,和函式入棧出棧是一樣的。
在這裡註冊了四個函式,理解為入棧的順序為fn1() -> fn2() -> fn3() -> fn4();出棧的順序正好相反,而什麼時候出棧呢?就是在呼叫函式結束時,準確的說應該是函式呼叫的最後的操作就是出棧過程。main()同樣也是乙個函式,在結束時,按出棧的順序呼叫四個函式,即為fn4() -> fn3() -> fn2() -> fn1();
註冊這個函式的目的就是為了在函式退出時呼叫的,即使是main()函式也是這樣的。可以在這些函式中加入一些清理工作,比如記憶體釋放等等。
main函式執行之前
main函式是我們的主程式入口函式。那麼在執行main函式之前我們的程式幫我們做了些什麼了?實際上在我們的系統裝載程式之後,首先執行的 並不是main的第一行,而是某些特別的 這些 會準備好main函式需要的環境,並且負責呼叫main函式,這時候才可以在main了寫各種業務 1 設定棧指標。2 初始...
main執行之前與之後
main函式執行之前,主要就是初始化系統相關資源 1.設定棧指標 2.初始化static靜態和global全域性變數,即data段的內容 3.將未初始化部分的賦初值 數值型short,int,long等為0,bool為false,指標為null,等等,即.bss段的內容 4.執行全域性構造器,估計是...
main函式之前會執行什麼?
我們 file name test00.c int main int argc,char argv cc test00.c o test.exe 會生成 test.exe cc test00.c nostdlib o test.exe undefined symbol start 也就是說 1.編譯...