前天面试,突然遇到上面的这个题目,我当时想直接做个全局类就能解决
void before_main()
{
printf("%s\n",__FUNCTION__);
}
void after_main()
{
printf("%s\n",__FUNCTION__);
}
class Test {
public:
Test(){ before_main(); }
~Test(){ after_main(); }
}
Test test; // 全局类变量,在main前调用构造,在main结束后,调用析构函数
int main(int argc,char **argv)
{
printf("%s\n",__FUNCTION__);
return 0;
}
上面是用C++实现的,面试官问如果用C,如何实现,谷歌了一下,发现真有解决方案,只是利用了编译器一些特性实现罢了,不知这样面试可有意义.
在GCC中,可以使用attribute关键字,声明constructor和destructor,代码如下:
// 可声明多个constructor,在main前调用多个函数
__attribute((constructor)) void before_main()
{
printf("%s\n",__FUNCTION__);
}
__attribute((destructor)) void after_main()
{
printf("%s\n",__FUNCTION__);
}
int main( int argc, char **argv )
{
printf("%s\n",__FUNCTION__);
return 0;
}
在VC6中,不支持attribute关键字,可使用如下方法(未在vs2010下测试通过,after_main没有执行):
int main( int argc, char ** argv )
{
printf("%s\n",__FUNCTION__);
return 0;
}
int before_main()
{
printf("%s\n",__FUNCTION__);
return 0;
}
int after_main()
{
printf("%s\n",__FUNCTION__);
return 0;
}
typedef int func();
#pragma data_seg(".CRT$XIU") // 定义共享数据段
static func *before[] = { before_main };
#pragma data_seg(".CRT$XPU")
static func *after[] = { after_main };
#pragma data_seg()