最初发表在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。
..... (全文见上方链接)