本文讨论3种 使函数在main函数执行前运行的方法:
1.使用attribute关键字,声明constructor和destructor函数(gcc中,注意:vc中不支持attribute)
2.通过段名称“…CRT$XIU”,“.CRT$XCU”把函数放在“C/C++初始化函数表”中
3.利用全局对象的构造函数会在main函数之前执行的特点
具体实现代码如下,该代码在VC++中验证通过:
#include <iostream>
using namespace std;
//0.gcc中使用attribute关键字,声明constructor和destructor函数
/*
//vc中不支持attribute
__attribute((constructor))void before()
{
printf("before main\n");
}
*/
//
//1.通过段名称“.CRT$XIU”,“.CRT$XCU”把函数表放在“C/C++初始化函数表”中
//通过特殊的段名称“.CRT$XIU”,“.CRT$XCU”,
//链接器会把before1表放在“C初始化函数表”中,类似这样
//[__xi_a, ..., before1(xiu), ..., __xi_z].
//同理,before2表会被链接器放在“C++初始化函数表”中,象这样
//[__xc_a, ..., before2(xcu), ..., __xc_z],
int before_main1()
{
printf("before_main1()\n");
return 0;
}
int before_main2()
{
printf("before_main2()\n");
return 0;
}
int after_main()
{
printf("after_main()\n");
return 0;
}
typedef int func();
#pragma data_seg(".CRT$XIU") //用#pragma data_seg建立一个新的数据段并定义共享数据
//static func * before1[] = { before_main1 };
func *before1 = before_main1;
#pragma data_seg(".CRT$XCU")
//static func * before2[] = { before_main2 };
func *before2 = before_main2;
#pragma data_seg()
//
//2.全局对象的构造函数会在main函数之前执行
class my_class{
public:
my_class()
{
cout<<"my class constructor"<<endl;
}
~my_class()
{
cout<<"my class destructor"<<endl;
}
};
my_class test;
void main()
{
_onexit(after_main);
cout<<"this's main start"<<endl;
}
以下是输出结果:
before_main1()
before_main2()
my class constructor
this’s main start
after_main()