C++的进入点是main()吗?
什么代码比main()更早被执行?
在linux下我们可以写一个startup code,通常情况下main()是通过startup code调用的,所以startup code会比main()更早执行,它是C++真正的进入点(entry point)。
下面我们来写一段startup code:
首先创建一个entrypoint.c文件(.cpp也可以),写入我们的startup code。
在这个startup中我们有两个函数,一个blabla()函数,一个main()函数,接下来我们将blabla()函数设置为entry pont(C/C++程序进入点),使用gcc的-e指令进行编译,就可以以告诉链接器使用blabla作为程序进入点,执行结果如下:
我们可以看到,main()函数并没有被startup code调用,所以并没有被执行。
而startup code实际上为一个函数,所以startup code一定是C/C++程序中最早被执行的函数。
而在Windows下的C++程序又分为命令行(console),窗体程序(Win32),以及动态链接库(WinDll),他们的主函数名称各不相同,startup code会争对不同的C++程序调用不同的主函数。
在VC6.0下,默认的Startup code由4个文件组成,分别为crt0.c,wcrt0.c,wincrt0.c,wwincrt0.c,而wcrt0.c,wincrt0.c,wwincrt0.c这三个文件全部include了crt0.c,所以startup code的核心全部在crt0.c中。