我们有时候需要在函数退出的时候做一些诸如释放资源的操作,但程序退出的方式有多种,例如main()函数运行结束后退出,或者在程序某处调用exit()退出等等,因此需要有一种与程序退出方式无关的方法来进行程序退出时的一些必要处理。那么,有一个问题,在main()函数执行完之后还能执行其他语句吗?答案是肯定的。atexit()函数就可以用来注册在程序终止时被调用的函数。
atexit()函数的参数是一个函数指针,指向一个没有参数也没有返回值的函数(即被注册的退出时的处理函数),atexit()原型如下:
int atexit(void (* func) void);
在一个程序中,最多可以用atexit()注册32个处理函数,这些函数的调用顺序与其注册顺序是相反的,即最先注册的最后被调用,最后注册的最先被调用。一个简单的例子如下:
#include <stdio.h>
#include <stdlib.h>
void function_1(void);
void function_2(void);
void function_3(void);
int main(void)
{
atexit(function_1);
atexit(function_2);
atexit(function_3);
printf("Main exit....\n");
return 0;
}
void function_1()
{
printf("Calling function_1.....\n");
}
void function_2()
{
printf("Calling function_2.....\n");
}
void function_3()
{
printf("Calling function_3.....\n");
}
上面的例子中,main()函数调用了atexit()依次注册了函数function_1(),function_2()和function_3(),运行该程序,得到的结果如下:
可以看到,main()函数执行完后,function_3()、function_2()和function_1()依次被调用,调用顺序与注册顺序相反。