Quelle est la signature correcte de la main
fonction en C ++? Quel est le type de retour correct et que signifie renvoyer une valeur main
? Quels sont les types de paramètres autorisés et quelle est leur signification?
Ce système est-il spécifique? Ces règles ont-elles changé au fil du temps? Que se passe-t-il si je les enfreins?
main
retourner en C et C ++ .Réponses:
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éesmain
, 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 lamain
fonction qui désigne le début du programme.La
main
fonction ne peut pas être déclarée commestatic
ouinline
. Il ne peut pas non plus être surchargé; il ne peut y avoir qu'une seule fonction nomméemain
dans l'espace de noms global.La
main
fonction ne peut pas être utilisée dans votre programme: vous n'êtes pas autorisé à appeler lamain
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éclarentmain
avec un type de retour devoid
; c'est probablement la règle la plus fréquemment violée concernant lamain
fonction).Deux déclarations
main
doivent être autorisées: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
etargv
.argv
est un pointeur vers un tableau de chaînes C représentant les arguments du programme.argc
est le nombre d'arguments dans leargv
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: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 unereturn
instruction dansmain()
: si vous laissezmain()
return sansreturn
instruction explicite , c'est la même chose que si vous aviez écritreturn 0;
. Les deuxmain()
fonctions suivantes ont le même comportement:Il existe deux macros,
EXIT_SUCCESS
etEXIT_FAILURE
, définies dans<cstdlib>
qui peuvent également être renvoyéesmain()
pour indiquer respectivement le succès et l'échec.La valeur renvoyée par
main()
est transmise à laexit()
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é.la source
Main
être une fonction membre statique car il n'a même pas de fonctions non membres. Même C89 obligemain
à revenirint
. Je ne suis pas suffisamment familier avec K&R C pour connaître ses règles exactes, mais j'imagine que cela nécessite égalementmain
de retournerint
carmain
sans type de retour était assez courant et sans type = impliciteint
dans K&R.int
.void
type de retour comme extension de langage . Les compilateurs qui ne le permettent pas incluent GCC et Comeau.À partir de la documentation standard., 3.6.1.2 Fonction principale ,
int main() { / ... / }
etint main(int argc, char* argv[]) { / ... / }
J'espère que cela pourra aider..
la source
main
devrait êtreint
?void
casser ce modèle. Cela n'a même pas vraiment de sens si vous aviez cela signifie «toujours juger le succès». Parce que vous n'aviez aucun moyen de dire si le processus a réellement échoué, avez-vous vraiment réussi? Non, reviensint
.Le libellé exact de la dernière norme publiée (C ++ 14) est:
Cela indique clairement que des orthographes alternatives sont autorisées tant que le type de
main
est le typeint()
ouint(int, char**)
. Les éléments suivants sont donc également autorisés:int main(void)
auto main() -> int
int main ( )
signed int main()
typedef char **a; typedef int b, e; e main(b d, a c)
la source
int main(void)
n'était pas correcte en C ++.auto main() -> int
n'a pas de type de retour déduit. Faites attention au {in "(auto main () {... is not allowed)" et apprenez à savoir quand vous n'en savez pas encore assez pour ajouter quelque chose de significatif.Les deux réseaux valides sont
int main()
etint main(int, char*[])
. Toute autre chose peut être compilée ou non. Simain
ne renvoie pas explicitement une valeur, 0 est retourné implicitement.la source
main
à annuler. Y a-t-il une raison spécifique pour laquelle le type de retour de main doit être int?int
comme type de retour demain
est que cette valeur est transmise au shell en tant que code de sortie du programme etsh
attend unint
.void
ils sont tous silencieux. Avecint
nous devons définir la valeur de sortie spécifique pour chaque retour demain
.Détails sur les valeurs de retour et leur signification
Par 3.6.1 (
[basic.start.main]
):Le comportement de
std::exit
est détaillé dans la section 18.5 ([support.start.term]
), et décrit le code d'état:la source