【问题标题】:main() in C, C++, Java, C#C、C++、Java、C# 中的 main()
【发布时间】:2010-12-05 02:14:31
【问题描述】:

C、C++、Java 或 C# 中的 main()(或 Main())是用户定义函数还是内置函数?

【问题讨论】:

    标签: c# java c++ c main


    【解决方案1】:

    这是程序执行所必需的用户定义函数。当您以编译语言运行程序时,将执行 main 函数。例如,在 Java 中,如果您在一个类中具有签名 public static void main(String ... args) 的函数,那么该类可以被执行,因为 JVM 将执行该 main 方法的内容。

    Java 中的示例:

    public class Test {
      public static void main(String ... args) { 
        System.out.println("Hello World");
      }
    }
    

    ...

    javac Test.java
    

    ...

    java Test
    

    导致“Hello World”被打印到控制台。

    【讨论】:

    • 如果您告诉链接器使用另一个函数作为入口点,则不需要。
    • @Ryan - 我们中的一些人(cough Java cough)不享受拥有链接器的甜蜜特权。
    • @Ryan - 我们中的一些人(cough me cough)不喜欢与链接器打架,如果我们不需要的话;)
    • @Ryan - 在 Java 中没有链接器,并且您的 main 方法必须具有签名 public static void main(String[] args) 并且您无法更改它。
    【解决方案2】:

    我不确定您所说的内置与用户定义是什么意思。几乎没有一种语言实际上赋予您的用户定义函数作为程序真正入口点的特权。 C++、任何 .NET 语言和 Java 都具有隐藏(内置)入口点方法,这些入口点方法反过来调用您的用户定义的 Main 方法(或该语言的任何入口点方法被调用 - 在 .NET 中,它可以被命名任何东西,尽管 C# 和 VB.NET 强制它被称为 Main)。

    所以是的,几乎每一种语言都有一个自动调用的方法的概念,这个方法是用户定义的方法,通常是强制性的。但几乎每种语言都有一个内置的入口点方法,在调用用户定义的“入口点”函数之前,它实际上为进程设置了框架和/或内存管理。

    【讨论】:

    • 不错的答案。我只想补充一点,“main”这个名字并不重要,因为大多数体面的链接器都允许您手动指定入口点。 (例如 VS 的 /ENTRY)
    【解决方案3】:

    引用 C 标准(重点是我的):

    5.1.2.1 独立环境

    1. 在独立的环境中(在 执行 C 程序可能需要哪些时间 没有任何好处的地方 操作系统),名称和 调用的函数的类型 程序启动是 实现定义。任何 图书馆设施可供 独立程序,除了 第 4 条要求的最小集合, 由实现定义。

    main(),在独立环境中,很大程度上是一个用户定义的函数。

    【讨论】:

      【解决方案4】:

      这是一个必需的用户定义函数(可执行文件的入口点)...

      【讨论】:

        【解决方案5】:

        它不是任何语言的“内置”,从某种意义上说没有标准实现——main() 可用。

        对于 C/C++/Java,它是一个具有特殊属性的函数,即在所有静态设置完成后,将在程序开始时调用的函数。例如。整个C程序的执行路径是:

        1. 做一些初始化代码

        2. 致电main()

        3. 退出。

        因此,它有一个标准声明(从命令行传递的参数数量+“字符串”数组 - 但是语言实现了 - 这是来自命令行的实际参数)

        【讨论】:

        • 仅供参考——“主要”几乎是 VB.NET 中内置的。您实际上必须工作才能公开它并将您自己的实现放在适当的位置......
        • VB 有 main()? (老实说,我最后一次接触 Basic 是在 Sinclair Z80 PC 拥有时代......
        【解决方案6】:

        在 C/C++ 中,它是一个标准,因此它被内置并重新整合。

        Java,不确定,没有经验

        C# - 它是类的一部分,因此由您定义。

        所有这些都是由你定义的——你告诉它要做什么。

        【讨论】:

          【解决方案7】:

          这是一个由语言的运行时库调用的用户定义函数。例如,C 运行时库将从操作系统中获取命令行参数,有时还会获取环境变量,并将它们传递给您的 main() 函数。

          不同的语言运行时通常以一种或另一种形式执行相同的操作,如果它尝试调用的函数不存在,则会抛出某种错误。

          【讨论】:

            【解决方案8】:

            它的声明是内置的。它的定义是用户提供的,或者在某些情况下由具有其他入口点的应用程序框架提供,或者在大多数事件驱动的 GUI 框架的情况下,没有单个用户定义的入口点。

            【讨论】:

              【解决方案9】:

              在 Java 中,main(String[] args) 按照惯例是应用程序的入口点(使 C++ 程序员感到舒适)。对于 applet 或 servlet,代码的调用发生方式不同。请注意,一个 jar 可能包含这些入口点中的任何一个或不包含这些入口点,并且每个类都可能包含一个 main,因此如果需要,可以以多种不同的方式调用给定的 jar 作为应用程序。

              【讨论】:

                猜你喜欢
                • 2015-04-25
                • 2010-10-12
                • 2015-04-18
                • 2012-03-10
                • 2011-05-13
                • 1970-01-01
                • 1970-01-01
                • 2012-01-10
                • 1970-01-01
                相关资源
                最近更新 更多