【问题标题】:Execution at main method在 main 方法处执行
【发布时间】:2011-04-10 10:06:10
【问题描述】:

嗨,

对于 C、C++、Java 等语言(我熟悉这些),我们通常看到程序执行从 main 方法开始。我想知道编译器如何知道程序中MAIN 方法的存在。

除了它是程序执行的入口点之外,main 方法还意味着什么...这些标准对于 C 和 C++ 有何不同...

提供您认为有帮助的任何链接...

【问题讨论】:

  • 在 C/C++ 中,它不会链接到没有 main 的可执行文件,因为运行时调用函数 main() 来启动程序。在 Java 中,它基本上是相同的过程,但在启动时执行。
  • 请注意,'main' 仅在默认情况下是特殊的;链接加载器可以选择指定任何函数名称作为入口点。
  • 请记住,在 C++ 中,全局变量的构造函数将在 之前 main() 执行
  • 我想以前有关于这个话题的问题。相当不错的骗子Why the name main for function main(),以及相关的C program without main function ?main() in C, C++, Java, C#。其他有趣的东西:[是负责设置堆栈的程序还是操作系统](stackoverflow.com/questions/3265057)。

标签: java c++ c execution


【解决方案1】:

通常,在每个 C 或 C++ 程序(通常由编译器/链接器默认包含)开始执行的代码会进行一些初始化,然后调用名为 main 的函数。如果此函数不存在,则在链接程序时将导致名称未解析(其中所有名称都必须解析)。如果存在,就会被程序初始化代码调用。

初始化代码做一些家务(比如将main函数的返回值转换为程序的退出代码等)

【讨论】:

    【解决方案2】:

    什么都没有。它只是程序起点的常规名称。

    C 中,main()sin() 或任何其他函数一样正常。托管实现中的唯一要求是它符合原型之一

    int main(void);
    int main(int, char **);
    

    编辑

    您甚至可以从您的代码中调用main() :)

    #include <stdio.h>
    int main(int argc, char **argv) {
        printf("main() called with %d arguments.\n", argc);
        if (argc) {
            main(0, NULL);
        }
        return 0;
    }
    

    【讨论】:

    • 正如您所指出的,这对 C 来说是正确的。在 C++ 中,main 有点特别;不能直接调用,不能重载等。
    • 嗯,好的。我不知道。感谢您的提醒:)
    • main() 也与 sin()(至少在 C 中)有很大不同,因为在从对 main() 的初始调用返回后,将调用 atexit() 注册函数。
    【解决方案3】:

    在 Windows 上,一切都以便携式可执行文件格式开头:http://en.wikipedia.org/wiki/Portable_Executable

    入口地址可以通过链接器指定:http://msdn.microsoft.com/en-us/library/y0zzbyt4.aspx

    托管应用程序在其程序集元数据中引用了静态 main 方法。同样,这是编译器的命令行选项:http://msdn.microsoft.com/en-us/library/6s2x2bzy%28v=VS.71%29.aspx

    【讨论】:

    • -1 用于为与平台无关的问题提供特定于平台的答案
    • 耶!亚历克斯因提供错误答案而获得 +8 代表。
    猜你喜欢
    • 1970-01-01
    • 2018-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-16
    • 1970-01-01
    • 2012-12-03
    相关资源
    最近更新 更多