我在C语言中知道,在main()
上启动应用程序之前,某些实体必须:
问题1-这个东西是什么实体?谁写的?
问题2-C ++中还有其他内容吗?
我假设在main()
答案 0 :(得分:2)
问题1-这个东西是什么实体?谁写的?
C编译器团队编写它。
发生的事情是特定于OS的,但基本上它会执行诸如处理命令行参数,打开/连接stdin,stdout,stderr等之类的事情。
如果您深入研究gcc或clang源代码,我相信您可以找到代码 1 。您可以将选项传递给链接器,以在程序不需要时不包含此代码。例如,如果您既不读取参数也不使用文件,并且想要自己进行其他设置,则可以传入参数以不包含启动代码。
问题2-C ++中还有其他内容吗?
是的,C中没有构造函数和析构函数之类的东西,因此,如果没有其他C ++可以处理这些东西。
答案 1 :(得分:2)
很大程度上取决于执行环境。在C运行时启动之前,操作系统加载程序可能会做很多工作,这是可执行文件运行的一部分。设置执行环境的这一与操作系统相关的部分对于所有本机(机器语言)可执行文件都是通用的,而与源实现语言无关。
操作系统的作用是什么,可执行文件中的代码所执行的是什么,取决于执行环境。操作系统加载程序(在非独立系统中)负责将代码加载到内存中,并且可能涉及加载和链接动态链接的库(DLL或共享库,具体取决于操作系统的术语)。无论是OS还是C运行时责任,通常都会发生以下情况:
main()
(argv
,argc
个参数)创建堆栈框架例如,在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 ++中因素都很好。