Dre*_*f D 2 c program-entry-point return
可能重复:
main()在C/C++中应该返回什么?
#include<stdio.h>
int main()
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在上面给出的代码片段中,main返回的返回0在哪里?或者换句话说,哪个函数在开始时称为主函数.
Ada*_*eld 12
main由C运行时库中的某些启动函数调用.C语言标准说返回main等同于调用exit函数,所以大多数C运行时看起来像这样:
void _start(void) /* Exact function signature may vary */
{
/* Platform-specifi startup (e.g. fetch argc and argv from the OS) */
...
int status = main(argc, argv);
exit(status);
/* Never reached */
}
Run Code Online (Sandbox Code Playgroud)
退出状态会传递回操作系统,然后从那里发生的操作系统依赖于操作系统.
编译和链接程序时,可执行文件格式(例如PE或ELF)包含起始地址,该地址是执行开始的虚拟地址.该函数通常是C运行时库的一部分(_start如上例所示).该函数必须通过调用系统调用来结束exit,因为如果它刚刚返回,它将无处可去:它只会从堆栈中弹出一个地址并跳转到该位置,这将是垃圾.
根据不同的OS加载器如何初始化过程中,程序参数argc,argv以及其他数据(如环境)可能要么进来作为函数的参数(通过寄存器或堆栈),或者他们可能需要的系统调用(例如,GetCommandLine在Windows上)检索它们.但是处理所有这些是C运行时的工作,除非你明确地避免使用C运行库,否则你不必担心这些细节.