808 votes

Que devrait retourner main () en C et C ++?

646voto

workmad3 Points 12974

La valeur de retour de main doit indiquer la façon dont le programme est sorti. Sortie normale est généralement représenté par un 0 valeur de retour de main. En cas d'arrêt anormal est généralement signalé par un retour non nul, mais il n'y a pas de norme pour la façon dont la non-zéro codes sont interprétées. Aussi, comme indiqué par d'autres, void main() est explicitement interdite par la norme C++ et ne doit pas être utilisé. Le valide en C++ main signatures:

int main()

et

int main(int argc, char* argv[])

ce qui est équivalent à

int main(int argc, char** argv)

Il est également intéressant de noter qu'en C++, int main() peut être laissé sans valeur de retour, à quel point la valeur par défaut est de retour 0. Cela est également vrai avec un C99 programme. Si return 0 doit être omis ou n'est pas ouvert au débat. La plage valide de C principal du programme de signatures est beaucoup plus grande.

Aussi, l'efficacité n'est pas un problème avec l' main fonction. Il ne peut être saisi et à gauche une fois (programme de marquage de début et de fin) selon la norme C++. Pour le C, le cas est différent et re-entrer dans main() est autorisée, mais doit sans doute être évitée.

208voto

Chris Young Points 8525

L'on a accepté la réponse semble être ciblé pour le C++, donc, j'ai pensé ajouter une réponse qui se rapporte à C, et cela diffère de plusieurs façons.

ISO/IEC 9899:1989 (C90):

principal devrait être déclarée comme suit:

int main(void)
int main(int argc, char **argv)

Ou l'équivalent. Par exemple, int main(int argc, char *argv[]) est équivalent à la seconde. En outre, l'int type de retour peut être omis que c'est un défaut.

Si une mise en œuvre permet, la principale peut être déclarés dans d'autres façons, mais cela rend la mise en œuvre du programme défini, et non plus strictement conformes.

La norme définit les 3 valeurs de retour qui sont strictement conformes (qui est, ne repose pas sur la mise en œuvre de comportement défini): 0 et EXIT_SUCCESS pour une fin réussie, et EXIT_FAILURE pour un échec de la résiliation. Toutes les autres valeurs sont non-standard et la mise en œuvre définies. principal doit avoir un retour explicite à la fin pour éviter un comportement indéterminé.

Enfin, il n'y a rien de mal à partir d'un point de vue avec l'appel de main() à partir d'un programme.

ISO/IEC 9899:1999 (C99):

Pour C99, tout est la même que ci-dessus sauf:

  • L'int type de retour ne peut pas être omis.
  • Vous pouvez omettre l'instruction de retour de main. Si vous le faites, et les principaux fini, il y a un rendement implicite 0.

140voto

Jonathan Leffler Points 299946

[J'ai copié une version étendue de mes réponses à la copie de questions ici, car il couvre (et les citations) Standard C, C++ Standard de Microsoft et de variations, dont aucune des autres réponses ici semble faire. Depuis ce qui semble être la première question sur un Débordement de Pile couvrant le sujet, il devrait être celui qui a été choisi comme la question définitive, et il devrait avoir la meilleure (la plus près de définitif) réponse(s).]

C Standard

Pour un environnement hébergé (c'est normal), le C11 norme (ISO/IEC 9899:2011) dit:

5.1.2.2.1 démarrage du Programme

La fonction appelée au démarrage du programme est nommé main. La mise en œuvre déclare aucun prototype de cette fonction. Il doit être défini avec un type de retour d' int et sans paramètres:

int main(void) { /* ... */ }

ou avec deux paramètres (dénommée ci - argc et argv, bien que les noms peuvent être utilisées car elles sont locales à la fonction dans laquelle elles sont déclarées):

int main(int argc, char *argv[]) { /* ... */ }

ou l'équivalent;10) ou dans certains autres définis par l'implémentation.

S'ils sont déclarés, les paramètres de la fonction main doit obéir à la suivante contraintes:

  • La valeur de argc doit être positif ou nul.
  • argv[argc] doit être un pointeur null.
  • Si la valeur de argc , est supérieure à zéro, les membres du groupe argv[0]par argv[argc-1] inclusive doit contenir des pointeurs vers des chaînes, qui sont donnés mise en œuvre-les valeurs définies par l'hôte de l'environnement avant le démarrage du programme. L' l'intention est de fournir de l'information sur le programme les a préalablement déterminés avant le démarrage du programme d'ailleurs dans l'environnement hébergé. Si l'hôte de l'environnement n'est pas capable de la fourniture de chaînes de caractères avec des lettres à la fois des majuscules et des minuscules, la mise en œuvre veillent à ce que les chaînes sont reçues en minuscules.
  • Si la valeur de argc , est supérieure à zéro, la chaîne pointée par argv[0] représente le nom du programme; argv[0][0] doit être le caractère null si l' nom du programme n'est pas disponible à partir de l'hôte de l'environnement. Si la valeur de argcest supérieur à un, les chaînes de caractères pointée par argv[1] par argv[argc-1] représentent les paramètres du programme.
  • Les paramètres argc et argv et les chaînes pointées par l' argv tableau est être modifiable par le programme, et de conserver leur dernier-valeurs stockées entre programme de démarrage et de fin de programme.

10) Ainsi, int peut être remplacé par un typedef nom défini comme int, ou le type d' argv peut être écrite comme char **argv, et ainsi de suite.

De fin de programme en C99 ou C11

La valeur renvoyée par main() est transmis à l '"environnement" dans une mise en œuvre défini.

5.1.2.2.3 de fin de Programme

1 Si le type de retour de la main fonction est un type compatible avec int, un retour de l' appel initial à l' main fonction est équivalent à l'appel de l' exit de la fonction avec la valeur retourné par l' main fonction comme argument;11) d'atteindre l' } qui met fin à la main de la fonction renvoie une valeur de 0. Si le type de retour n'est pas compatible avec int, le la résiliation état renvoyé à l'environnement d'accueil est quelconque.

11) conformément À l'6.2.4, la durée de vie des objets avec stockage automatique de la durée déclarée en main terminée dans le premier cas, même là où ils n'auraient pas dans le second.

Notez que 0 est mandaté comme "succès". Vous pouvez utiliser EXIT_FAILURE et EXIT_SUCCESS de <stdlib.h> si vous préférez, mais 0 est bien établi, et est donc 1. Voir aussi les codes de Sortie supérieure à 255 - ce possible?.

En C89 (et donc dans Microsoft C), il n'existe aucune déclaration au sujet de ce qui se passe si l' main() fonction retourne mais ne spécifie pas de valeur de retour; il a donc conduit à un comportement indéterminé.

Standard C++

Le C++11 norme (ISO/IEC 14882:2011) dit:

3.6.1 fonction Principale [de base.commencer.principal]

¶1 Un programme doit contenir une fonction globale appelée principal, qui est le départ du programme. [...]

¶2 Une mise en œuvre ne doit pas prédéfinir la fonction principale. Cette fonction ne doit pas être surchargé. Il est avoir un type de retour de type int, mais sinon, son type est définie par l'implémentation. Toutes les implémentations doit permettre à la fois de la définition suivante de la page principale:

int main() { /* ... */ }

et

int main(int argc, char* argv[]) { /* ... */ }

Dans cette dernière forme argc est le nombre d'arguments passés au programme à partir de l'environnement dans lequel le programme est exécuté. Si argc est différente de zéro, ces arguments doivent être fournies en argv[0] par le biais argv[argc-1] que des pointeurs vers les caractères initiaux de null chaînes de caractères multi-octets (NTMBSs) (17.5.2.1.4.2) et argv[0] est le pointeur vers le premier caractère d'un NTMBS qui représente le nom utilisé pour appeler le programme ou "". La valeur de argc sont non-négatives. La valeur de argv[argc] sera de 0. [ Note: Il est recommandé que tous les autres paramètres (facultatif) être ajoutés après l' argv. la fin de l' note ]

¶3 La fonction main ne doit pas être utilisé à l'intérieur d'un programme. [...]

¶5 de l'instruction return dans le main a l'effet de quitter la fonction principale (en détruisant tous les objets avec automatique durée de stockage) et de l'appel de std::sortie avec la valeur de retour comme argument. Si le contrôle atteint la fin de la main sans la rencontre d'une instruction de retour, l'effet est celui de l'exécution de

return 0;

La norme C++ explicitement dit: "Elle [la fonction principale] a un type de retour de type int, mais sinon, son type est définie par l'implémentation", et exige la même chose de deux signatures que le C standard. Donc un " void main()' n'est pas directement admis par la norme C++, mais il n'y a rien qu'elle peut faire pour arrêter un non-standard permettant la mise en œuvre des solutions de rechange. A noter que C++ interdit à l'utilisateur d'appeler l' main (mais la C standard ne fonctionne pas).

Extension Commun

Classiquement, les systèmes Unix appuyer une troisième variante:

int main(int argc, char **argv, char **envp) { ... }

Le troisième argument est null liste de pointeurs sur des chaînes de caractères, dont chacun est une variable d'environnement qui a un nom, un signe égal, et une valeur (éventuellement vide). Si vous n'utilisez pas, vous pouvez toujours obtenir à l'environnement en passant par 'extern char **environ;'. Depuis longtemps, qui n'ont pas d'en-tête qui l'a déclaré, mais la POSIX 2008 norme exige qu'il soit déclaré en <unistd.h>.

Ce fait est reconnu par la norme comme une extension commune, documenté dans l'Annexe J:

J. 5.1 Environnement arguments

¶1 Dans un environnement hébergé, la fonction principale reçoit un troisième argument, char *envp[], que de points pour un nul tableau de pointeurs char, dont chacun des points d'une chaîne de caractères qui fournit des informations sur l'environnement d'exécution du programme (5.1.2.2.1).

Microsoft C

Le Microsoft VS 2010 compilateur est intéressant. Le site web dit:

La syntaxe de déclaration des principaux est

 int main();

ou, éventuellement,des

int main(int argc, char *argv[], char *envp[]);

Sinon, l' main et wmain fonctions peuvent être déclarés comme retournant void (pas de valeur de retour). Si vous déclarez main ou wmain retournant void, vous ne pouvez pas retourner un code de sortie du processus parent ou du système d'exploitation à l'aide de l'instruction return. Pour retourner un code de sortie lors de l' main ou wmain est déclaré en tant que void, vous devez utiliser l' exit fonction.

Il n'est pas clair pour moi ce qui se passe (ce code de sortie est remise à la société mère ou de l'o/s) lorsqu'un programme avec void main() t sortie - et le MME site web est trop silencieux.

Il est intéressant de noter, MS ne prescrit pas la version à deux arguments de main() que le C et le C++ normes exigent. Il ne prescrit trois argument forme où le troisième argument est - char **envp, un pointeur vers une liste de variables d'environnement.

Microsoft page répertorie également des alternatives - wmain() qui prend l'échelle des chaînes de caractères, et un peu plus.

Microsoft VS 2005 version de cette page ne liste pas l' void main() comme une alternative. Les versions de Microsoft VS à partir de 2008 ne.

67voto

dmityugov Points 2786

Je crois que main() devrait retourner soit EXIT_SUCCESS ou EXIT_FAILURE . Ils sont définis en stdlib.h

32voto

Lou Franco Points 48823

Retourne 0 sur les succès et non nulle pour l’erreur. C’est la norme utilisée par UNIX et DOS script pour savoir ce qui s’est passé avec votre programme.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X