在C ++中main之前会发生什么?

时间:2018-12-01 12:18:34

标签: c++

我在C语言中知道,在main()上启动应用程序之前,某些实体必须:

  1. 初始化全局变量
  2. 将堆栈指针设置为最低的堆栈区域地址(假设堆栈向上增长)

问题1-这个东西是什么实体?谁写的?

问题2-C ++中还有其他内容吗? 我假设在main()

之后,对象构造函数和初始化都在应用过程中完成。

3 个答案:

答案 0 :(得分:2)

  

问题1-这个东西是什么实体?谁写的?

C编译器团队编写它。

发生的事情是特定于OS的,但基本上它会执行诸如处理命令行参数,打开/连接stdin,stdout,stderr等之类的事情。

如果您深入研究gcc或clang源代码,我相信您可以找到代码 1 。您可以将选项传递给链接器,以在程序不需要时不包含此代码。例如,如果您既不读取参数也不使用文件,并且想要自己进行其他设置,则可以传入参数以不包含启动代码。

  

问题2-C ++中还有其他内容吗?

是的,C中没有构造函数和析构函数之类的东西,因此,如果没有其他C ++可以处理这些东西。

1:here's an example

答案 1 :(得分:2)

很大程度上取决于执行环境。在C运行时启动之前,操作系统加载程序可能会做很多工作,这是可执行文件运行的一部分。设置执行环境的这一与操作系统相关的部分对于所有本机(机器语言)可执行文件都是通用的,而与源实现语言无关。

操作系统的作用是什么,可执行文件中的代码所执行的是什么,取决于执行环境。操作系统加载程序(在非独立系统中)负责将代码加载到内存中,并且可能涉及加载和链接动态链接的库(DLL或共享库,具体取决于操作系统的术语)。无论是OS还是C运行时责任,通常都会发生以下情况:

  • 建立堆栈
  • 对初始化的静态数据进行零初始化
  • 初始化已初始化的静态数据
  • C库初始化(通常stdio和堆管理需要一些初始化)
  • 对于C ++调用静态构造函数。
  • main()argvargc个参数)创建堆栈框架

例如,在GCC和其他一些编译器中,由您的程序而不是操作系统执行的部分是在程序启动之前由称为crt0.o的单独链接的模块执行的。这通常是用汇编器编写的,默认情况下会自动链接。

有关更多示例和讨论,请参见:

答案 2 :(得分:1)

在这个答案中,我研究了C程序的入口点位置:Is main() really start of a C++ program?

当我对C ++进行类似分析时,结果基本相同,并且正如其他人所提到的,它是glibc的一部分,其回溯位置为main

#0  main () at hello.cpp:3
#1  0x00007ffff7be50b3 in __libc_start_main (main=0x5555555551a9 <main()>, argc=1, argv=0x7fffffffbfb8, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7fffffffbfa8) at ../csu/libc-start.c:308
#2  0x00005555555550ee in _start ()

所以与C程序完全相同。

我认为C ++编译器只是调用钩子来实现任何特定于C ++的功能,并且在C / C ++中因素都很好。