前天面试,突然遇到上面的这个题目,我当时想直接做个全局类就能解决

        

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()