最近的一段时间在return这个关键字进行了一点的探究,主要是涉及到调用return之后函数会进行什么操作。
return
是一个关键字,调用
return
会进行函数的返回,将后面的参数返回给调用者(main函数也是被调用的),并销毁调用堆栈。
以上是return函数的作用,接下来主要看一下main函数的
return
之后会发什么。测试代码如下:
int main()
{
return 0;
}
进行单步调试会发现,main函数
return
后(这时main函数的堆栈已经被销毁),会返回到
invoke_main()
函数内,并执行下一条语句,invoke_main()函数如下:
static int __cdecl invoke_main() throw()
{
return main(__argc, __argv, _get_initial_narrow_environment());
}
可见
main()
函数是被
invoke_main()
函数调用的,之后
invoke_main()
再次返回。
可以看到,
invoke_main()
也是被调用的,调用者函数是
__scrt_common_main_seh() throw()
,使用整形
main_resul
来接受
invoke_main()
函数的返回值,在图片最上方的注释可以知道之前的初始化已经完成,开始调用main函数。之后进行退出操作:
进入
__scrt_is_managed_app()
函数
上面的函数执行完成之后会返回一个
false
由于返回的是
false
,取反后条件成立,会执行
exit(main_result)
,即退出进程,退出码为
main_result
。
以上便是
main()
从调用return到进程退出的整个过程,有什么不正确的地方希望大家指出,加以修改。