main() 主函数执行完毕后,是否可能会再执行一段代码?给出说明。
main主函数是所有程序必须具备的函数,是C/C++人员一接触代码就知道的函数,那么这个问题会难倒很多人,尤其是平常不注意思考,不懂得问为什么的程序员,这个问题的答案是:main() 函数结束后可以执行一些代码,进行清理工作。
具体请看下面的解析。
先来看一段代码:
#include <stdlib.h>
#include <stdlib.h>
#include <stdio.h>
void fnl(void), fn2(void), fn3(void), fn4(void);
int main( void ){
// atexit()函数原型为:int atexit(void (*function)(void));
atexit(fnl);
atexit(fn2);
atexit(fn3);
atexit(fn4);
printf("This is executed first.\n");
return 0;
}
void fnl(){ //main退出后执行的函数
printf("next.\n");
}
void fn2(){
printf("executed " );
}
void fn3(){
printf("is ");
}
void fn4(){
printf("This ");
}
运行结果:
看到没,fn1()、fn2()、fn3()、fn4()就是在main()函数运行结束后调用的。
这里最关键的是使用了 atexit() 函数,讲 atexit() 函数之前先讲一下 exit() 函数。
exit()函数用于在程序运行的过程中随时结束程序,其原型为:
void exit(int state);
exit的参数state是返回给操作系统或当前程序的调用程序,返回0表示程序正常结束,非0表示程序非正常结束。main函数结束时也会隐式地调用exit()函数。exit()函数运行时首先会执行由atexit()函数登记的函数,然后会做一些自身的清理工作,同时刷新所有输出流、关闭所有打开的流并且关闭通过标准I/O函数tmpfile()创建的临时文件。
atexit() 用于注册终止函数(即main执行结束后调用的函数),其原型为:
int atexit(void (*function)(void));
很多时候我们需要在程序退出的时候做一些诸如释放资源的操作,但程序退出的方式有很多种,比如main()函数运行结束、在程序的某个地方用exit()结束程序、用户通过Ctrl+C或Ctrl+break操作来终止程序等等,因此需要有一种与程序退出方式无关的方法来进行程序退出时的必要处理。方法就是用atexit()函数来注册程序正常终止时要被调用的函数。
atexit()函数的参数是一个函数指针,函数指针指向一个没有参数也没有返回值的函数。
在一个程序中最多可以用atexit()注册32个处理函数,这些处理函数的调用顺序与其注册的顺序相反,也即最先注册的最后调用,最后注册的最先调用。同一个函数如若登记多次,则也会被调用多次。
正如上面程序中所示,这些函数都是在main结束以后才被调用的。atexit()只是注册他们,使得他们在main结束以后被调用,看名字就可以看出来。