要想在main函式之前或之後執行一段**,就得清楚在main函式執行之前程式都會幹些啥,main函式執行之後又會幹些啥?
main函式
main函式,又稱主函式,是程式執行的起點。
每個c/c++**都有乙個main函式,程式啟動後,會開啟乙個主線程執行main函式,在main函式內部我們可以開啟很多執行緒,如果主函式main,return的話,這些在main函式裡開啟的執行緒都會結束。(這是大方向上可以這樣講)
其實,在程式執行之前,首先執行的**並不是main的第一行,而是某些特別的**,這些**準備好main函式執行所需要的環境,並且負責呼叫main函式,這時你才可以在main函式裡放心大膽的寫各種**:申請記憶體、使用系統呼叫、觸發異常、訪問io。在main函式返回之後,他會記錄main函式的返回值,呼叫atexit註冊的函式,然後結束程序。
- main函式前:
程式在執行時會呼叫各種各樣的執行時庫函式,因此執行前main函式必須要初始化好執行時庫,還要完成一些全域性變數以及c記憶體分配等初始化工作,在c++裡,還要執行全域性類物件的建構函式。最後才呼叫main函式。
所以我們可以根據這些特點來進行。
法一:c/c++方法
利用全域性變數的建構函式初始化的時候可以被執行的特點來進行。
#include
using
namespace std;
class
a//建構函式};
a a;
//宣告乙個全域性變數
intmain()
法二:c++方法全域性變數的賦值函式,會在main之前執行。(c中好像不允許通過函式給全域性變數賦值)
#include
#include
using
namespace std;
intf()
int a =f(
);intmain()
執行結果:
法三:如果是gnuc的編譯器,可在你要執行的方法前加__attribute__((constructor))
#include
__attribute__
((constructor)
)void
func()
intmain()
本方法參考網上方法,本人的編譯器可能和所說的不一樣,沒有執行出來
- main函式後:
在main函式返回之後,系統會記錄main函式的返回值,呼叫atexit註冊的函式,然後結束程序。
法一:c/c++方法
利用析構函式的特點
#include
using
namespace std;
classa}
;a a;
intmain()
執行結果:
法二:如果是gnuc的編譯器,可在你要執行的方法前加__attribute__((destructor))
#include
void
func()
__attribute__
((destructor)
)void
after()
intmain()
法三:c/c++onexit(func) 對於c 或 atexit(func) 對於c++
#include
using
namespace std;
intfunc1
(void
)void
func2
(void
)int
main()
注意:
1、這裡對atexit函式進行一些解釋
很多時候我們需要在程式退出的時候做一些諸如釋放資源的操作,但程式退出的方式有很多,比如main()函式執行結束、在程式的某個
地方用exit()結束程式、使用者通過ctrl+c等操作來終止程式等等,因此需要一種與程式退出方式無關的方法來進行程式退出時的必要處理。
方法就是用atexit()函式來註冊程式正常終止時要被呼叫的函式。
atexit()函式的引數時乙個函式指標,函式指標指向乙個沒有引數也沒有返回值的函式。它註冊乙個函式,使得呼叫exit時或函式
main返回時會呼叫這個函式,如果註冊成功,則atexit函式返回0,否則返回非0值。所有向atexit函式註冊的函式按與註冊相反的順序呼叫,然後再由atexit函式完成所有標準清理操作。
atexit()函式原型是;int atexit(void(*)(void));
2、attribute((constructor))應該是在main函式之前,執行乙個函式,便於我們做一些準備工作。
constructor引數讓系統執行main()函式之前呼叫函式(被
__arrribute__((constructor))修飾的函式)。同理,destructor讓系統在main()函式呼叫了exit()之後,呼叫我們的函式,帶有
這些修飾屬性的函式,對於我們初始化一些在程式中使用的資料非常有用。
在main 之前和之後呼叫自己的函式
文章出處 作者 vision chen yeah.net 下面給出乙個可移植的在main 函式之前和之後呼叫自己函式的一種實現方式 借助全域性變數先於main 構造和後於main 析構的原理。include include void before main void after main names...
c 中static變數在main函式之前執行
c c 語言中,在執行main的入口函式之前,是會首先執行一段 而對於全域性變數和static的初始化就是 在main函式之前執行的,例子如下 cpp view plain copy include include class static name static intstatic print p...
C語言中如何在main函式開始前執行函式
在gcc中,可以使用attribute關鍵字,宣告constructor和destructor,如下 cpp view plain copy print?include attribute constructor void before main attribute destructor void ...