Exit () fait-il quelque chose de spécial que «return» ne fait pas?
Avec certains compilateurs pour les plates-formes inhabituelles, exit()
pourrait traduire son argument en valeur de sortie de votre programme tandis qu'un retour de main()
pourrait simplement passer la valeur directement à l'environnement hôte sans aucune traduction.
La norme requiert un comportement identique dans ces cas (en particulier, elle indique que renvoyer quelque chose qui est int
compatible à partir de main()
devrait être équivalent à appeler exit()
avec cette valeur). Le problème est que différents systèmes d'exploitation ont des conventions différentes pour interpréter les valeurs de sortie. Sur de nombreux systèmes (BEAUCOUP!), 0 signifie succès et tout le reste est un échec. Mais sur, par exemple, VMS, les valeurs impaires signifient le succès et même les valeurs signifient l'échec. Si vous renvoyiez 0 de main()
, un utilisateur VMS verrait un méchant message concernant une violation d'accès. Il n'y avait pas réellement de violation d'accès - c'était simplement le message standard associé au code d'échec 0.
Puis l'ANSI est venu et a béni EXIT_SUCCESS
et EXIT_FAILURE
comme arguments vous pourriez passer exit()
. La norme indique également que exit(0)
devrait comporter de manière identique à exit(EXIT_SUCCESS)
, de sorte que la plupart des implémentations définissent EXIT_SUCCESS
à 0
.
La norme, par conséquent, vous met dans une liaison sur VMS, car elle ne laisse aucun moyen standard de renvoyer un code d' échec qui se trouve avoir la valeur 0.
Le compilateur VAX / VMS C de l'ère du début des années 1990 n'a donc pas interprété la valeur de retour main()
, il a simplement renvoyé toute valeur à l'environnement hôte. Mais si vous avez utiliséexit()
il ferait ce que la norme exigeait: traduire EXIT_SUCCESS
(ou 0
) en un code de réussite et EXIT_FAILURE
en un code d'échec générique. Pour utiliser EXIT_SUCCESS
, vous deviez passer à exit()
, on ne pouvait pas retourner à partir main()
. Je ne sais pas si des versions plus modernes de ce compilateur ont préservé ce comportement.
Un programme C portable ressemblait à ceci:
#include <stdio.h>
#include <stdlib.h>
int main() {
printf("Hello, World!\n");
exit(EXIT_SUCCESS); /* to get good return value to OS */
/*NOTREACHED*/ /* to silence lint warning */
return 0; /* to silence compiler warning */
}
En plus: Si je me souviens bien, la convention VMS pour les valeurs de sortie est plus nuancée qu'impaire / paire. Il utilise en fait quelque chose comme les trois bits bas pour coder un niveau de gravité. D'une manière générale, cependant, les niveaux de gravité impairs indiquaient le succès ou des informations diverses et les pairs même indiquaient des erreurs.