【问题标题】:What happens with the return value of main()? [duplicate]main() 的返回值会发生什么? [复制]
【发布时间】:2012-10-23 10:47:28
【问题描述】:

可能重复:
What should main() return in C/C++?

#include<stdio.h>
int main()
{
    return 0;
}

上面给出的代码sn-p中,main返回的return 0去哪里了?或者换句话说,最开始是哪个函数调用了主函数。

【问题讨论】:

    标签: c return main


    【解决方案1】:

    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 */
    }
    

    退出状态被传递回操作系统,然后从那里发生的事情取决于操作系统。

    当您编译和链接您的程序时,可执行文件格式(例如 PE 或 ELF)包含一个起始地址,即开始执行的虚拟地址。该函数通常是 C 运行时库的一部分(如上面的示例 _start)。该函数必须通过调用诸如exit 之类的系统调用来结束,因为如果它刚刚返回,它将无处可去:它只会从堆栈中弹出一个地址并跳转到该位置,这将是垃圾。

    根据操作系统加载程序初始化进程的方式,程序参数argcargv 和其他数据(例如环境)可能作为函数参数(通过寄存器或堆栈)进入,或者它们可能需要系统调用(例如 Windows 上的 GetCommandLine)来检索它们。但是处理所有这些都是 C 运行时的工作,除非您明确地想尽办法避免使用 C 运行时,否则您不必担心这些细节。

    【讨论】:

    • 如果您猜对了,请至少做对 - 在大多数托管环境中,我看到 _start()main() 具有相同的签名。
    • 我认为没有明确搜索“main”。 Main 只是编译器使用的约定。程序在其文件格式标头结束后开始。操作系统扫描格式标头以了解有关文件的详细信息,包括(我认为)程序开始的位置,或者它可能会根据其他提供的标头信息隐含地理解这一点。
    • @annoying_squid 不,main 只是一个和其他符号一样的符号,启动存根调用它
    【解决方案2】:

    您的编译器以特定平台为目标,其中包括用于启动进程的操作系统特定机制。该平台特定代码的一部分包含main 的返回值。当您将程序链接到可执行文件时,链接器会添加一段特定于操作系统的二进制代码,该代码负责调用 main 并将返回值报告回操作系统。

    【讨论】:

      【解决方案3】:

      返回值转到托管环境。通常,操作系统调用main 并获取程序的退出状态。

      【讨论】:

        【解决方案4】:

        main 返回的 return 0 去哪了?或者换句话说,最开始是哪个函数调用了主函数。

        它由 C 启动库调用,这是一个(几乎)由内核直接调用的存根函数。例如,在 Linux 和 OS X 上,它是一个名为 _start 的函数。它与main() 具有相同的签名,并且操作系统本身使用它的返回值。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-07-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-09-30
          • 2017-05-21
          • 2017-05-25
          相关资源
          最近更新 更多