2010-11-15 5 views
3

Possible en double:
return statement vs exit() in main()Pourquoi le renvoi explicite de 0 de main() est-il considéré comme une bonne pratique?

Je viens de lire le premier chapitre de Accelerated C++ (semble comme un livre impressionnant), et à la fin l'auteur dit

Toutefois, l'inclusion explicite d'un retour de main est une bonne pratique. »

Pourquoi est-ce considéré comme une bonne pratique? En C99, j'ai toujours omis le return 0, en utilisant exit() pour signaler la fin anormale du programme, et je n'ai jamais manqué le retour explicite.

+3

http://stackoverflow.com/questions/461449/return-statement-vs-exit-in-main – Flexo

+2

Ce n'est pas un doublon. – torhu

Répondre

4

En C99 et en C++ si l'exécution du programme atteint l'accolade fermante de la fonction main(), un return 0; implicite est exécuté. Ce n'était pas le cas en C90 - atteindre la fin de sans un return explicite se traduirait par une valeur indéterminée étant renvoyée (à proprement parler, le comportement est indéfini).

Je ne peux que deviner que les auteurs de "Accelerated C++" estiment que le retour explicite est une bonne pratique simplement parce qu'il rend votre intention explicite. La seule autre raison que je peux penser est que cela rend le code compatible avec C90, mais je trouve difficile de croire que cela aurait beaucoup de poids comme raison.

+0

Corrigez-moi si je me trompe, mais je pensais qu'avant la C99, une fonction avec un type de retour déclaré pouvait retourner légalement sans spécifier de valeur si elle pouvait être sûre (par exemple sur des paramètres) que l'appelant n'essaierait jamais pour utiliser la valeur de retour. Pour ne pas dire que quelqu'un * devrait * jamais écrire du code comme ça, mais je pense qu'avant C99 un tel code était légal et n'invoquait pas UB. – supercat

1

Le programme appelant (généralement un shell de système d'exploitation) peut rassembler le code de retour et savoir si le programme a échoué ou non. Avoir un seul point de sortie d'un programme fait un bon endroit pour mettre un point d'arrêt.

Un flux d'exécution unique facilite le suivi d'un programme si vous n'êtes pas familier avec celui-ci.

+3

# 1 n'a pas d'importance. Laisser main sans retourner explicitement quelque chose revient à renvoyer implicitement '0'. – sbi

+0

En ce qui concerne les deux autres, vous ne pouvez pas utiliser 'return 0;' si vous voulez aussi avoir un seul point de sortie et indiquer une terminaison anormale. – visitor

+0

@visitor, vous pouvez avoir une variable qui suit l'état du programme et le renvoie. –

7

deux raisons,

tout d'abord, la principale est déclarée retourner int, et il devrait donc

d'autre part, et peut-être plus important encore C++ une sortie() de la principale sautera d'appel Destructeurs pour locale instances d'objet dans main.

1

Je pense que cette règle générale pas tant applique à la place callling exit(), mais pour tomber main() sans rien retour, en se fondant sur le return 0 implicite du système d'exécution doit faire dans ce cas.

Je suppose que main() est la seule fonction retournant une valeur où vous pouvez omettre explicitement retourner une valeur. OMI c'est une très bonne raison de ne pas se fier à cette règle.

-1

Par C++ standard main() doit retourner int. Il s'agit d'une application de code d'erreur qui revient à sa fin et, en pratique, cela est utile lorsque le processus demande si cette application s'est terminée avec succès (le code d'erreur est généralement 0 dans ce cas) ou a échoué.

Je donnerai un exemple spécifique à Microsoft, mais il montre le besoin général de renvoyer le code d'erreur: ProcessA doit créer ProcessB et attendre qu'il se termine, après quoi il veut vérifier si ProcessB s'est exécuté avec succès. ProcessA utilisera la fonction CreateProcess pour créer ProcessB, puis utilisera le handle de ProcessB pour attendre sa fin, puis utilisera la fonction GetExitCodeProcess pour obtenir le code de terminaison ProcessB - qui est une valeur int retournée par main().

Questions connexes