跑在main之前

最初发表在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。

..... (全文见上方链接)

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值