怎么在main函数开始前执行函数

阅读更多

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

        

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

 

你可能感兴趣的:(main函数)