web-dev-qa-db-fra.com

Fonctions principales multiples

Je suis un peu nouveau dans ce domaine, alors soyez indulgent avec moi. J'apprends actuellement C # et Java et l'une de leurs similitudes est que la fonction principale doit être encapsulée dans une classe. Par exemple

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

Maintenant, je comprends que principal est souvent le "point d'entrée" lorsque vous exécutez le programme. Donc, fondamentalement, votre programme commencera à s'exécuter où que soit la fonction principale. Mais je crois que dans les deux langues, vous pouvez avoir plusieurs fonctions principales dans plusieurs classes. Alors, quand je compile un projet avec plusieurs fonctions principales, où est le "point d'entrée"? Comment le compilateur sait-il par où commencer?

68
Ben

Dans .NET, vous pouvez définir quelle classe contient la méthode Main que vous souhaitez utiliser lors de la compilation.

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

En Java, si vous vous regroupez dans un pot, vous pouvez définir votre point d'entrée dans le manifeste du pot.

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

55
MStodd

En Java, l'ordinateur détermine le "point d'entrée" lorsque vous exécutez réellement le programme, pas lorsque vous compilez. Par exemple, à partir de la ligne de commande

Java MyClass

recherche main() dans MyClass. Toutes les autres fonctions main() sont ignorées.

Si vous utilisez un IDE, vous pouvez définir quelle classe contient la fonction main() que vous souhaitez utiliser.

58
Code-Apprentice

En C #, vous pouvez utiliser plusieurs méthodes Main.

S'il existe plusieurs méthodes Main, le compilateur ne sait pas quel point d'entrée utiliser et il vous montrera donc une erreur.

Vous devez spécifier la méthode Main à utiliser lors de la compilation: vous pouvez spécifier la méthode à utiliser utilisé comme option de compilateur dans l'environnement de développement Visual Studio ou via le compilateur csc.

17
Anirudha

La classe principale est une classe spéciale pour une seule raison: lorsque vous exécutez la machine virtuelle Java Virtual Machine, cette fonction est ce que la JVM appelle. Elle est essentiellement comme n'importe quelle autre fonction, et en fait vous pouvez appeler la fonction principale d'une classe à partir d'une autre classe.

Lorsque vous compilez un projet avec plusieurs classes, vous dites à la JVM d'exécuter la classe avec la classe principale que vous souhaitez utiliser, comme ceci:

Java SomeClass

et il exécutera la méthode principale de SomeClass, en supposant que SomeClass est compilé et que le fichier compilé approprié se trouve dans votre chemin de classe. (C'est quelque chose que vous devrez travailler avec votre système d'exploitation particulier, mais je pense qu'il est assez habituel pour l'option -cp de spécifier un chemin de classe). Donc ça:

Java -cp /home/MyName Someclass

exécutera la fonction principale de SomeClass dans le répertoire/home/MyName

12
CosmicComputer

En C #, vous spécifiez le point d'entrée à l'aide de l'option du compilateur /main:.

Considérez le code suivant contenant deux fonctions main():

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

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

Pour utiliser ClassOne.main() comme point d'entrée, vous devez spécifier les éléments suivants lors de la compilation:

csc /main:Application.ClassOne hello.cs
9
SetFreeByTruth

Pour plusieurs fonctions principales, le point d'entrée peut être déclaré par:

Pour définir cette option de compilateur dans l'environnement de développement Visual Studio

Ouvrez la page Propriétés du projet.

Cliquez sur la page de propriétés de l'application.

Modifiez la propriété de l'objet Démarrage.

référence: http://msdn.Microsoft.com/en-us/library/x3eht538.aspx

7
NG.

En Java, comme d'autres l'ont souligné, vous définissez la classe contenant votre fonction principale lorsque vous exécutez la commande Java.

Mais vous pouvez également créer un fichier exécutable, qui peut être exécuté avec Java -jar my.jar. Dans ce cas, vous avez besoin d'un fichier manifeste appelé MANIFEST.MF dans le dossier META-INF dans le pot. Dans ce fichier, vous spécifiez la classe contenant la fonction principale à l'aide de l'instruction: Main-Class: YourClass.

7
Sven Viehmeier

La méthode principale est statique, ce qui signifie qu'elle appartient à la classe plutôt qu'à l'objet. Ainsi, l'objet n'aura pas du tout d'autre méthode principale. Il n'aura pas de méthode principale supplémentaire, car main est statique. C'est donc une fois par classe.

Si vous avez plusieurs méthodes principales dans votre projet, vous spécifierez celle à lancer lors du démarrage de votre application

4
Yasir Mahmood

En fait, dans un fichier binaire, par exemple, le format PE dans Windows et le format ELF sous Linux ou tout autre système, l'en-tête du fichier binaire spécifiera où est l'adresse de début et il ne peut y en avoir qu'une.

Lequel devrait être le point d'entrée? Cela dépend de l'éditeur de liens. Tout comme @SetFreeByTruth a dit que vous pouvez le spécifier avec des paramètres de ligne de commande. De nombreux éditeurs de liens prennent en charge la spécification du point d'entrée avec des paramètres de ligne de commande. par exemple, gld de gnu peut spécifier le point d'entrée avec le paramètre -e.

Je ne connais pas le comportement de Java car il est chargé par Java machine virtuelle.

2
Johnny WU