【问题标题】:Multiple Main Functions多个主要功能
【发布时间】:2012-07-18 01:56:49
【问题描述】:

我对此有点陌生,所以请耐心等待。我目前正在学习 C# 和 Java,它们的相似之处之一是 main 函数需要封装在一个类中。例如

public class HelloWorld {
    public static void main(String[] args) {
        // Some Code
    }
}

现在我明白了 main 通常是您运行程序时的“入口点”。因此,基本上,您的程序将在 main 函数所在的任何位置开始执行。但我相信在这两种语言中,您都可以在多个类中拥有多个主要功能。那么当我编译一个具有多个主要功能的项目时,“入口点”在哪里呢?编译器如何知道从哪里开始?

【问题讨论】:

  • 每种语言的答案都不同。

标签: c# java main


【解决方案1】:

在 Java 中,计算机在您实际执行程序时确定“入口点”,而不是在您编译时。例如,从命令行

java MyClass

MyClass 中搜索main()。所有其他 main() 函数都将被忽略。

如果您使用的是 IDE,那么您可以设置哪个类包含您要使用的 main() 函数。

【讨论】:

  • 在Java中,它搜索public static void main(String[] args)
  • @LuiggiMendoza 是的,这是正确的。为简洁起见,我省略了 main() 的完整签名,因为 OP 已经证明他知道它是什么。
  • 或者方法签名public static void main(String[])public static void main(String ...)非常精确。
  • 其他主要方法不会被“忽略”,它们只是不会自动执行。程序员可以编写显式调用类的 main 方法的代码。
  • 哇哦!我的第一枚银牌!感谢所有为这个答案投票的人!
【解决方案2】:

在 .NET 中,您可以定义哪个类包含您在编译时要使用的 Main 方法。

http://msdn.microsoft.com/en-us/library/x3eht538.aspx

在 Java 中,如果您要捆绑到一个 jar 中,您可以在 jar 的清单中定义您的入口点。

http://docs.oracle.com/javase/tutorial/deployment/jar/appman.html

【讨论】:

  • 我很惊讶这是投票最多的答案。至少对于 Java,Code-Guru 和 @CosmicComputer 的答案似乎对大多数人来说更相关。我想说,除了少数发布“可执行”jar 之外,很少有开发人员会使用 manifest 方法。
  • @GeorgeHawkins 在我看来,这是解决这两种语言问题的唯一答案,尽管对于 Java 这可能不是最佳答案。
【解决方案3】:

在 C# 中,您可以使用多个 Main 方法。

如果有多个Main 方法,编译器不知道使用哪个入口点,因此会显示错误。

需要specify the Main method在编译时使用: 您可以在 Visual Studio 开发环境中或通过 csc 编译器指定要用作编译器选项的方法。

【讨论】:

  • 我不了解 C#,但在 Java 中,这是不正确的。 Java 编译器不关心将使用哪个入口点;它将编译所有这些。另一方面,必须告知运行时环境要执行哪个入口点。
  • 是的...但是这个 ans 是参考 c# 而不是 java
  • @Code-Guru:对于 C#,答案是正确的,因为程序集在编译时指定了一个入口点 - 您不要在执行时指定类名,只是程序集名称。
  • @JonSkeet 原始答案未指定语言。感谢您的编辑,阿尼鲁达。
【解决方案4】:

主类是一个特殊的类,原因只有一个:当您运行 Java 虚拟机时,该函数就是 JVM 调用的函数。它本质上与任何其他函数一样,实际上您可以从另一个类调用一个类的主函数。

当你编译一个包含多个类的项目时,你告诉 JVM 运行你想要使用的主类的类,如下所示:

java SomeClass

它将运行 SomeClass 的 main 方法,假设 SomeClass 已编译并且适当的编译文件在您的类路径中。 (这是您必须使用特定操作系统解决的问题,但我认为 -cp 选项指定类路径是相当常见的)。所以这个:

java -cp /home/MyName Someclass

会在/home/MyName目录下运行SomeClass的main函数

【讨论】:

    【解决方案5】:

    在 C# 中,您使用 /main: 编译器选项指定入口点。

    考虑以下包含两个main() 函数的代码:

    namespace Application {
        class ClassOne {
            static void main () {
                // Code here
            }
        }
    
        class ClassTwo {
            static void main () {
                // Code here
            }
        }
    }
    

    要使用ClassOne.main() 作为您的入口点,您需要在编译时指定以下内容:

    csc /main:Application.ClassOne hello.cs
    

    【讨论】:

      【解决方案6】:

      正如其他人指出的那样,在 Java 中,您在运行 java 命令时定义了包含您的 main 函数的类。

      但您也可以构建一个可执行的 jar,它可以使用 java -jar my.jar 运行。在这种情况下,您需要在 jar 中的文件夹 META-INF 中创建一个名为 MANIFEST.MF 的清单文件。在此文件中,您使用以下语句指定包含主函数的类:Main-Class: YourClass

      【讨论】:

        【解决方案7】:

        对于多个主函数的入口点可以声明为:

        在 Visual Studio 开发环境中设置此编译器选项

        打开项目的属性页面。

        单击应用程序属性页。

        修改 Startup 对象属性。

        参考:http://msdn.microsoft.com/en-us/library/x3eht538.aspx

        【讨论】:

        • 你有什么想法在 JetBrain Rider 中做同样的事情吗?因为我试图查看项目应用程序属性,但找不到启动对象
        • 抱歉,我的机器上没有安装 JetBrains。
        • 要更改 Rider 中的启动对象,您必须编辑 .csproj 文件(可能使用 F4,取决于键绑定)。
        【解决方案8】:

        主要方法是静态的,这意味着它属于类而不是对象。所以对象内部根本不会有另一个主要方法。它不会有额外的 main-method,因为 main 是静态的。所以每堂课一次。

        如果您的项目中有多个主方法,您将在启动应用程序时指定要启动的主方法

        【讨论】:

        • 为了澄清,一个类可以有多个主要方法。例如,您可以拥有public static void main()public static void main(String[])。在 Java 中,运行时环境会寻找后一个签名来运行。
        【解决方案9】:

        其实在二进制文件中,例如windows中的PE格式,Linux或其他系统中的ELF格式,二进制文件的头部会指定起始地址在哪里,只能有一个。

        哪一个应该是入口点?这取决于链接器。就像@SetFreeByTruth 所说,您可以使用命令行参数指定它。 许多链接器支持使用命令行参数指定入口点。比如gnu的gld可以用参数-e指定入口点。

        我不知道Java的行为,因为它是由Java虚拟机加载的。

        【讨论】:

          【解决方案10】:

          在 Visual Studio 中,选择要作为入口点的项目,右键单击并设置为启动项目。

          【讨论】:

          • 那将是“启动项目”,但这不是他们的意思。如果您在一个项目/程序集中有多个潜在入口点,您将打开项目属性并从应用程序窗格中的“启动对象”下拉列表中进行选择。
          猜你喜欢
          • 2015-01-24
          • 1970-01-01
          • 2011-02-07
          • 2011-06-18
          • 1970-01-01
          • 1970-01-01
          • 2020-08-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多