多项主要职能

我在这方面还是个新手,所以请忍耐一下。我目前正在学习 C # 和 Java,它们的一个相似之处是 main 函数需要封装在一个类中。比如说

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

现在我明白了 main 通常是运行程序时的“入口点”。所以基本上,你的程序会在 main 函数所在的地方开始执行。但是我相信在这两种语言中,您可以在多个类中包含多个主函数。因此,当我编译一个具有多个主函数的项目时,“入口点”在哪里?编译器如何知道从哪里开始?

32151 次浏览

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

java MyClass

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

如果使用 IDE,则可以设置包含要使用的 main()函数的类。

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

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

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

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

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

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

您需要在编译时使用 指定 Main方法: 您可以指定在 VisualStudio 开发环境中或通过 csc 编译器使用哪个方法作为编译器选项。

在 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

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

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

java SomeClass

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

java -cp /home/MyName Someclass

将在/home/MyName 目录中运行 Some Class 的主函数

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

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

对于多个主函数,可以通过以下方式声明入口点:

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

打开项目的“属性”页。

单击 Application 属性页。

修改 Startup 对象属性。

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

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

如果项目中有多个 main-method,则将指定在启动应用程序时启动哪个 main-method

事实上,在二进制文件中,例如,在 Windows 中的 PE 格式和在 Linux 或任何其他系统中的 ELF 格式,二进制文件的头部将指定哪里是起始地址,并且只能有一个。

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

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

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