前天面试,突然遇到上面的这个题目,我当时想直接做个全局类就能解决
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()