La main
fonction doit être déclarée en tant que fonction non membre dans l'espace de noms global. Cela signifie qu'il ne peut pas être une fonction membre statique ou non statique d'une classe, ni ne peut être placé dans un espace de noms (même l'espace de noms sans nom).
Le nom main
n'est pas réservé en C ++ sauf en tant que fonction dans l'espace de noms global. Vous êtes libre de déclarer d'autres entités nommées main
, y compris entre autres, des classes, des variables, des énumérations, des fonctions membres et des fonctions non membres qui ne sont pas dans l'espace de noms global.
Vous pouvez déclarer une fonction nommée en main
tant que fonction membre ou dans un espace de noms, mais une telle fonction ne serait pas la main
fonction qui désigne le début du programme.
La main
fonction ne peut pas être déclarée comme static
ou inline
. Il ne peut pas non plus être surchargé; il ne peut y avoir qu'une seule fonction nommée main
dans l'espace de noms global.
La main
fonction ne peut pas être utilisée dans votre programme: vous n'êtes pas autorisé à appeler la main
fonction de n'importe où dans votre code, ni à prendre son adresse.
Le type de retour de main
doit êtreint
. Aucun autre type de retour n'est autorisé (cette règle est en gras car il est très courant de voir des programmes incorrects qui se déclarent main
avec un type de retour de void
; c'est probablement la règle la plus fréquemment violée concernant la main
fonction).
Deux déclarations main
doivent être autorisées:
int main() // (1)
int main(int, char*[]) // (2)
Dans (1) , il n'y a pas de paramètres.
Dans (2) , il y a deux paramètres et ils sont respectivement nommés argc
et argv
. argv
est un pointeur vers un tableau de chaînes C représentant les arguments du programme. argc
est le nombre d'arguments dans le argv
tableau.
Habituellement, argv[0]
contient le nom du programme, mais ce n'est pas toujours le cas. argv[argc]
est garanti comme étant un pointeur nul.
Notez que comme un argument de type tableau (comme char*[]
) n'est en réalité qu'un argument de type pointeur déguisé, les deux suivants sont tous deux des moyens valides d'écrire (2) et ils signifient tous deux exactement la même chose:
int main(int argc, char* argv[])
int main(int argc, char** argv)
Certaines implémentations peuvent autoriser d'autres types et nombres de paramètres; vous devrez vérifier la documentation de votre implémentation pour voir ce qu'elle prend en charge.
main()
est censé renvoyer zéro pour indiquer le succès et différent de zéro pour indiquer un échec. Vous n'êtes pas obligé d'écrire explicitement une return
instruction dans main()
: si vous laissez main()
return sans return
instruction explicite , c'est la même chose que si vous aviez écrit return 0;
. Les deux main()
fonctions suivantes ont le même comportement:
int main() { }
int main() { return 0; }
Il existe deux macros, EXIT_SUCCESS
et EXIT_FAILURE
, définies dans <cstdlib>
qui peuvent également être renvoyées main()
pour indiquer respectivement le succès et l'échec.
La valeur renvoyée par main()
est transmise à la exit()
fonction, qui met fin au programme.
Notez que tout cela ne s'applique que lors de la compilation pour un environnement hébergé (de manière informelle, un environnement dans lequel vous avez une bibliothèque standard complète et un système d'exploitation exécutant votre programme). Il est également possible de compiler un programme C ++ pour un environnement autonome (par exemple, certains types de systèmes embarqués), auquel cas le démarrage et l'arrêt sont entièrement définis par l'implémentation et une main()
fonction peut même ne pas être requise. Si vous écrivez du C ++ pour un système d'exploitation de bureau moderne, vous compilez pour un environnement hébergé.
main
retourner en C et C ++ .