多重主要function
我有点新,所以忍受着我。 我目前正在学习C#和Java,其中的一个相似之处在于主函数需要封装在一个类中。 例如
public class HelloWorld { public static void main(String[] args) { // Some Code } }
现在我明白了,当你运行程序的时候main是经常的“入口点”。 所以基本上,你的程序将在主函数的任何地方开始执行。 但我相信在这两种语言中,你可以在多个类中有多个主要的function。 所以当我编译一个具有多个主要function的项目时,“入口点”在哪里? 编译器如何知道从哪里开始?
在.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中,计算机确定实际执行程序时的“入口点”,而不是在编译时。 例如,从命令行
java MyClass
在MyClass
searchmain()
。 所有其他main()
函数都被忽略。
如果您正在使用IDE,则可以设置哪个类包含要使用的main()
函数。
在C#中,可以使用多个Main
方法。
如果有多个Main
方法,编译器不知道使用哪个入口点,因此会显示错误。
您需要指定要在编译时使用的Main
方法 :您可以指定在Visual Studio开发环境中或通过csc编译器将哪些方法用作编译器选项。
主类是一个特殊的类,只有一个原因:运行Java虚拟机时,该函数就是JVM所调用的。 它基本上和其他函数一样,实际上你可以从另一个类调用一个类的主函数。
当你用多个类来编译一个项目时,你告诉JVM使用你想要使用的主类来运行这个类,如下所示:
java SomeClass
它会运行SomeClass的主要方法,假定SomeClass被编译,并且相应的编译文件在你的类path中。 (这是你必须解决你的特定操作系统,但我认为这是相当平常的-cp选项指定一个类path)。 所以这:
java -cp /home/MyName Someclass
将在目录/ home / MyName中运行SomeClass的主要function
在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中,当您运行java
命令时,定义包含main函数的类。
但是你也可以build立一个可执行的jar文件,它可以使用java -jar my.jar
运行。 在这种情况下,需要在jar文件夹中的META-INF
文件夹中有一个名为MANIFEST.MF
的清单文件。 在这个文件中,用下面的语句指定包含main函数Main-Class: YourClass
。
对于多个主函数,入口点可以通过以下方式声明:
在Visual Studio开发环境中设置此编译器选项
打开项目的“属性”页面。
点击应用程序属性页面。
修改启动对象属性。
参考: http : //msdn.microsoft.com/en-us/library/x3eht538.aspx
主要方法是静态的,这意味着它属于类而不是对象。 所以这个对象根本就没有其他的主要方法。 它不会有一个额外的主要方法,因为主要是静态的。 所以每class有一次
如果您的项目中有多个主要方法,您将指定在启动应用程序时要启动哪一个
实际上,在二进制文件中,例如windows中的PE格式和Linux或任何其他系统中的ELF格式,二进制文件的头部将指定起始地址的起始位置,只能有一个。
哪一个应该是入口点? 这取决于链接器。 就像@SetFreeByTruth说的那样,你可以用命令行参数来指定它。 许多连接器支持用命令行参数指定入口点。 例如,gnu的gld可以用参数-e指定入口点。
我不知道Java的行为,因为它是由Java虚拟机加载的。
在Visual Studio中,select要作为入口点的项目,右键单击并设置为“启动项目”。