前情介绍
初学C++时,一般都会用hello world 这个示例来演示C++程序的语法及运行结果。
#include <iostream>
int main()
{
std::cout << "Hello World!\n";
}
那这时候肯定会有人说,为什么一定要写个 main函数?它有什么特别之处吗?
但是这时候都会说 你只需要知道每个C++程序必须有一个名字为 main 的函数就行了,程序将从这个函数开始执行。不知道这时,大家会不会有疑问,main函数真的是必须的吗?main函数真的是开始执行的吗?它执行之前到底还干了什么事情?
问题浅析
首先第一个问题,main函数真的是必须的吗已经由下面图片解答,下方图片是VS2022的项目属性中的一个设置选项,可以自定义程序启动时第一次启动的用户代码。意思是可以不叫 main函数这个名字,但是main函数的功能还是存在的。
第二个问题 main函数真的是开始执行的吗?
以下系列源码图片就已经解答了此问题,它不是第一个,甚至在启动顺序上都排不上号,在它前面已经有很多函数执行了。
第三个问题,在main函数之前,系统还进行了哪些动作?
这里就直接给出解答,因为有相当大一部分是操作系统完成的。
编译后的执行流程大致如下:
- 操作系统加载程序:操作系统加载可执行文件,并开始执行入口点函数(例如,
_start
)。 - 启动例程执行:
- 设置程序的运行环境。
- 初始化C++运行时库。
- 构造全局和静态对象(如果有)。
- 调用
main
函数:启动例程调用用户定义的main
函数。 - 执行
main
:main
函数中的代码被执行,输出"Hello, World!"。 main
返回:main
函数返回值被传递回启动例程。- 清理和退出:启动例程执行清理操作,如析构全局和静态对象,然后将返回值传递给操作系统,程序结束。
结论
虽然main
函数是C++程序的核心入口点,标志着用户代码的开始,但在实际执行过程中,main
之前还有一系列由运行时库和启动例程执行的初始化步骤。因此,main
并不是程序启动后第一个被执行的函数,但它是用户代码的第一个被调用的函数,起到了关键的作用。