atexit函数的执行顺序_多玩YY语音的面试题:C++中如何在main()函数之前执行操作?...
多玩YY语音的面试题:C++中如何在main()函数之前执行操作?
第一反应main()函数是所有函数执行的开始。但是问题是main()函数执行之前如何执行呢?
联想到MFC里面的 C**App类的theApp对象,其执行顺序就在main函数之前。道理相通,顺理推下,能够想到:如果在main函数之前声明一个类的全局的对象。那么其执行顺序,根据全局对象的生存期和作用域,肯定先于main函数。
示例如下:
classsimpleClass
{
public:
simpleClass( )
{
cout <
}
};
simpleClass g_objectSimple; //step1全局对象
int_tmain(intargc, _TCHAR* argv[])//step3
{
return0;
}
可单步调试查看执行顺序为step1、step2、step3。
考虑到全局对象,同理会进一步思考静态对象的作用域。将上述示例进一步扩展如下:
classsimpleClass
{
public:
simpleClass( )
{
cout <
}
};
classsimpleClassTwo
{
public:
staticsimpleClass m_sSimpleClass;
};
simpleClass simpleClassTwo::m_sSimpleClass = simpleClass(); //step1 静态对象
int_tmain(intargc, _TCHAR* argv[])//step3
{
return0;
}
可单步调试查看执行顺序为step1、step2、step3。
至此,我们可以总结出:定义在main( )函数之前的全局对象、静态对象的构造函数在main( )函数之前执行。
再进一步思考,既然可以在main( )函数之前执行全局、静态对象的构造函数。那么有没有函数在main( )函数之后执行呢?
有的,onexit函数。原型如下:
_onexit_t _onexit(
_onexit_t function
);
_onexit_t_m _onexit_m(
_onexit_t_m function
);
解释:The _onexit function is passed the address of a function (function) to be called when the program terminates normally. Successive calls to _onexit create a register of functions that are executed in LIFO (last-in-first-out)
order. The functions passed to _onexit cannot take parameters.
核心点:
1) 执行期——程序执行终止的时候;
2) 传递参数——函数的地址,即函数指针;
3) 执行顺序——后进先出。
_onexit is a Microsoft extension. For ANSI portability, use atexit. The _onexit_m version of the function is for mixed mode use.
onexit是微软的扩展版本,标准C++里面应用的是atexit。
【MSDN】示例:
#include
#include
/* Prototypes */
intfn1(void), fn2(void), fn3(void), fn4 (void);
intmain(void)
{
_onexit( fn1 );
_onexit( fn2 );
_onexit( fn3 );
_onexit( fn4 );
printf( "This is executed first.\n");
}
intfn1()
{
printf( "next.\n");
return0;
}
intfn2()
{
printf( "executed ");
return0;
}
intfn3()
{
printf( "is ");
return0;
}
intfn4()
{
printf( "This ");
return0;
}
执行结果如下:
显然,读程序可以看出main( )函数执行完毕后又执行了onexit( )函数。
还有没有其他特殊的情况呢?持续探讨、更新中……
atexit函数的执行顺序_多玩YY语音的面试题:C++中如何在main()函数之前执行操作?...相关推荐
- 多玩YY语音的面试题 C++中如何在main 函数之前执行操作
多玩YY语音的面试题:C++中如何在main()函数之前执行操作? 第一反应main()函数是所有函数执行的开始.但是问题是main()函数执行之前如何执行呢? 联想到MFC里面的 C**App类的t ...
- 语言中如何在main函数开始前执行函数
在gcc中,可以使用attribute关键字,声明constructor和destructor,代码如下: #include <stdio.h> __attribute((construc ...
- C++main函数的参数介绍以及如何在main函数前执行一段代码
C++中参数介绍:https://www.cnblogs.com/jisongxie/p/7892366.html C++中主函数的执行过程以及如何在main函数前执行一段代码:https://www ...
- c语言中总是从main函数开始,C语言总是从main函数开始执行吗
//-------------------------------------------------------- 本文目录结构 |-提出问题 |-解决问题 |-推荐文章 |-作业 //------ ...
- 编写一个C程序,实现以下功能:编写一个函数decTobin(int n),该函数能将一个十进制数n转换成二进制数,输入13 输出 1101。在main函数中输入整数n,调用函数,输出它的二进制
题目要求: 编写一个C程序,实现以下功能: //编写一个函数decTobin(int n),该函数能将一个十进制数n转换成二进制数,输入13 输出 1101. //在main函数中输入整数n,调用函数 ...
- mysql中的运算符的执行顺序_【MySQL】执行顺序
我去找你❤️ 我给你买❤️ 我带你去❤️ 我很爱你❤️ 我们回家❤️ 我们结婚❤️ 你听过最孤独的话是什么? 同学,code就剩你没提交了 今天讨论的话题是 MySQL执行顺序 ??? 先养眼,再看题 ...
- 宏任务和微任务执行顺序_确保任务的执行顺序
宏任务和微任务执行顺序 有时有必要对线程池中的任务施加一定的顺序. JavaSpecialists通讯的第206期提出了一种这样的情况:我们使用NIO从多个连接中读取数据. 我们需要确保来自给定连接的 ...
- vue父子组件生命周期执行顺序_关于Vue组件的生命周期及执行顺序
本文主要讲述了:Vue组件渲染时的生命周期及执行顺序 Vue组件数据变更时的生命周期及执行顺序 Vue组件嵌套时的生命周期及执行顺序 正文 组件渲染时的生命周期 在组件渲染时,每个Vue组件都有4个生 ...
- jmeter 线程执行顺序_软件接口测试工具Jmeter使用方法详解(一)
介绍完了接口测试是什么及其内在逻辑和Jmeter的安装,从这篇文章开始我们正式开始介绍Jmeter的使用方法.如果对接口测试逻辑流程和Jmeter安装有疑问的朋友,可以看这两篇文章: 星空下:软件接口 ...
最新文章
- Western Digital使用5400 rpm级硬盘使所有人感到困惑
- c# 联合halcon 基于相关性 模板匹配_宣城seo公司_有效利用及时相关性解决关键词排名上不到首页的难题...
- this关键字+super关键字
- js中的正则表达式(2)
- 在Ubuntu中部署并测试Fabric 1.0 Beta
- redis配置文件redis.conf详细说明
- Ora-12505 故障
- 21天c语言 ppt,21天学通C语言 第1章 C语言与程序概述.ppt
- 【拆解】便携示波器怎么选?
- 《华为工作法》5 态度有时候比能力更加重要
- 网络应用的基本原理(基础 !非常重要!)
- U盘文件、文件夹不显示却能搜索到 显示U盘文件的解决办法
- (一)Activiti 数据库25张表——一般数据1 (ACT_GE_BYTEARRAY)
- 【人情世故】汇报措辞
- 微信企业号开发:corpsecret到底在哪块呢?
- 访问不到webapp
- 区块链跨链技术之BTC Relay
- android 中存储文件所在位置
- 联诚发召开宝安区卓越绩效管理标准实施项目启动大会
- 大数据搜索引擎技术_网络数据搜索技术