最初發表在QQ空間(這裡貼圖不方便),全文見 跑在main之前 和 跑在main之前 (2) ,有圖有真相。
通常這是一個面試題,如何讓一段代碼跑在main()函數前面。一個熟練的C++開發人員能夠輕易給出答案,即靜態初始化。
在C裡面又如何呢,有沒有辦法做到這點?下面講一個VC裡的方法。
int initBeforeMain(){printf( "initBeforeMain (%p)/r/n", initBeforeMain );return 0;}int init2BeforeMain(){printf( "init2BeforeMain (%p)/r/n", init2BeforeMain );return 0;}int initBreak(){DebugBreak();return 0;}typedef int (*pInit)();// for C// put following table between __xi_a and __xi_z#pragma data_seg( ".CRT$XIU" )pInit start[] = {initBeforeMain, init2BeforeMain, initBreak, };#pragma data_seg()// for C++// put following table between __xc_a and __xc_z#pragma data_seg( ".CRT$XCU" )pInit start2[] = {initBeforeMain, init2BeforeMain, initBreak, };#pragma data_seg()// for C// put following pointer between __xi_a and __xi_z but after start#pragma data_seg( ".CRT$XIU" )pInit start3 = initBreak;#pragma data_seg()int main( int argc, char* argv[] ) {}
在調試器裡執行一下,看看效果如何,有沒有給你surprise。
..... (全文見上方連結)