C++面试题之 main函数执行完之后还会调用其他的函数吗?
感谢原作者,原文地址:click me
初次从面试宝典中看到这个问题,我那也是一脸的懵逼啊。老师一直告诉我们,main是函数的入口地址,执行完成后,就返回操作系统了。殊不知还有这么多没了解过的知识。
题目:
main()函数执行完后,还会调用执行其他的语句吗?
我们通常认为C语言的起始函数是main()函数,实质上一个程序的启动函数并不一定是main()函数,这个可以采用链接器来设置,但是gcc中默认main()就是C语言的入口函数,在main函数启动之前,内核会调用一个特殊的启动例程,这个启动例程从内核中取得命令行参数值和环境变量值,为调用main()函数做好准备。
因此对应程序而言main()函数并不是起始,但是对应C 语言而言,main()函数就是入口地址。
按照ISO C的规定,一个进程可以登记多达32个函数,这些函数将由exit自动调用,通常这32个函数被称为终止处理程序,并调用atexit()函数来登记这些函数。 (函数的调用顺序与注册的顺序是相反的,通过下面的实例可以看出来)
举例
代码如下:
- #include<stdio.h>
- #include<stdlib.h>
- void fun1(void)
- {
- printf("fun1\n");
- }
- void fun2(void)
- {
- printf("fun2\n");
- }
- void fun3(void)
- {
- printf("fun3\n");
- }
- int main()
- {
- atexit(fun1);
- atexit(fun2);
- atexit(fun3);
- printf("main exit\n");
- return 0;
- }
运行结果:
函数说明:
头文件:#include <stdlib.h>
定义函数:int atexit (void (*function) (void));
atexit()用来设置一个程序正常结束前调用的函数. 当程序通过调用exit()或从main()中返回时, 参数function 所指定的函数会先被调用, 然后才真正由exit()结束程序。