100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > atexit函数的执行顺序_多玩YY语音的面试题:C++中如何在main()函数之前执行操作?...

atexit函数的执行顺序_多玩YY语音的面试题:C++中如何在main()函数之前执行操作?...

时间:2024-01-21 21:54:04

相关推荐

atexit函数的执行顺序_多玩YY语音的面试题:C++中如何在main()函数之前执行操作?...

多玩YY语音的面试题:C++中如何在main()函数之前执行操作?

第一反应main()函数是所有函数执行的开始。但是问题是main()函数执行之前如何执行呢?

联想到MFC里面的 C**App类的theApp对象,其执行顺序就在main函数之前。道理相通,顺理推下,能够想到:如果在main函数之前声明一个类的全局的对象。那么其执行顺序,根据全局对象的生存期和作用域,肯定先于main函数。

示例如下:

classsimpleClass

{

public:

simpleClass()

{

cout<

}

};

simpleClassg_objectSimple;//step1全局对象

int_tmain(intargc,_TCHAR*argv[])//step3

{

return0;

}

可单步调试查看执行顺序为step1、step2、step3。

考虑到全局对象,同理会进一步思考静态对象的作用域。将上述示例进一步扩展如下:

classsimpleClass

{

public:

simpleClass()

{

cout<

}

};

classsimpleClassTwo

{

public:

staticsimpleClassm_sSimpleClass;

};

simpleClasssimpleClassTwo::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("Thisisexecutedfirst.\n");

}

intfn1()

{

printf("next.\n");

return0;

}

intfn2()

{

printf("executed");

return0;

}

intfn3()

{

printf("is");

return0;

}

intfn4()

{

printf("This");

return0;

}

执行结果如下:

显然,读程序可以看出main( )函数执行完毕后又执行了onexit( )函数。

还有没有其他特殊的情况呢?持续探讨、更新中……

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。