我們對入口函式之前可以做什麼

2021-07-10 13:57:54 字數 1174 閱讀 4914

從來沒有過這樣的需求, 不過這個一定很有趣, 我在stackoverflow看到這個標題時, 第一時間馬上想到了c++中利用全域性物件的函式就可以達到這個目的. 正如stackoverflow下面的回帖:

class startup

};startup startup; // a global instance

c++中的構造甚至可以直接寫成下面這樣, foo也會被呼叫在main之前

int b = foo();

int main()

顯然, c中是沒有class概念的, 所以就不太好弄了, 不過不必擔心, gcc提供了方便, 直接上**:

#include

void beforemain (void) __attribute__ ((constructor));

void

beforemain (void)

intmain (int argc, char **argv)

這樣, 同樣會在main呼叫之前, 呼叫這個指定的函式beforemain, 不盡如此, gcc還提供了乙個destructor操作, 將指定函式呼叫發生在main呼叫完成之後. gcc確實很好玩, 但是如果是用vc編譯器呢? 不幸的是vc編譯器不支援這樣玩. stackoverflow上高人很多, 我一下子就搜尋到了方法(其實我也想到了利用crt的初始化來達到這個目的, 但我不知道如何寫**)

#include

static

void __cdecl after(void)

static

void __cdecl before(void)

#pragma section(".crt$xcu",read)

__declspec(allocate(".crt$xcu")) static void (__cdecl* fbefore)(void) = before;

int main()

這段**幹嘛了呢, 實際上就是在.crt$xcu裡分配了乙個函式位址, 並使其指向before, 當程式一啟動時, 程式首先是執行crt的初始化**, 比如初始化全域性物件呀什麼的, 這些初始化函式都以乙個表的形式包含在.crt$xcu這個節裡面, crt初始化時會迴圈呼叫這些函式來進行初始化.

atexit 是指定某個函式在退出時插入到crt反初始化表的功能.

stackoverflow上的參考:

msdn參考:

main函式入口

最近在弄boost test單元測試的時候,遇到了乙個執行程式後就閃退掉的問題,找了好久才發現,原來是沒有進入到boost 自己的main函式中,因為鏈結的其他lib中,有乙個檔案也定義了main函式,編輯器最終是選擇了那個main函式作為程式的入口。在vs下 main函式 通常是 int tmai...

python入口函式

在乙個.py檔案中,如果不是在定義函式,也就是說不是在def關鍵字的內嵌結構內,python會預設其餘部分函式是main函式,並自動執行,但正規工程中,一般都會將main函式寫為 if name main 每個人都在寫,但很少有人問,其實這個用法很巧妙!1 2 3 4 5 6 7 8 hello.p...

jQuery 入口函式

載入模式 js和jquery的區別title 原生js 函式覆蓋問題 js window.onload function ev window.onload function 輸出結果 彈出 hello twojs jquery document ready function document rea...