Exit() en C
RésoluJ'ai lu que il faut utiliser exit(EXIT_SUCCESS) quand la valeur est égale à 0, et quand la valeur est égale à 1, il faut utiliser exit(EXIT_FAILURE).
Mais comment on sait si la valeur est égale a 1 ou 0 ??
Configuration: Windows 7 / Firefox 3.5.8
7 réponses
La discussion porte sur l’utilisation des constantes EXIT_SUCCESS et EXIT_FAILURE en C pour indiquer la réussite ou l’échec d’un programme, et sur la relation avec les valeurs 0 et 1. Plusieurs réponses précisent que EXIT_SUCCESS vaut 0 et signifie la réussite, mais que EXIT_FAILURE n’est pas nécessairement égal à 1 selon la norme, ce qui dépend de l’implémentation. En pratique, EXIT_SUCCESS et EXIT_FAILURE sont des int et non des booléens; l’essentiel est d’interpréter EXIT_SUCCESS comme réussite et EXIT_FAILURE comme échec, indépendamment de leur valeur numérique exacte. D'autres échanges précisent que le choix du type main et la valeur de retour doivent refléter la convention du langage et les besoins d’interopérabilité, sans se limiter à des chiffres.
-
Contributeurexit(EXIT_SUCCESS) vaut pareil que exit(0) ce qui signifie que le programme s'est bien déroulé.
En revanche, rien ne dit dans la norme EXIT_FAILURE vale 1.
Cdlt, -
Lorsque la valeur que renvoie le main est 0, c'est que tout s'est très bien passé. Lorsqu'il renvoie 1 c'est que ça ne s'est pas bien passé. En fait, EXIT_SUCCESS et EXIT_FAILURE sont des defines situés dans stdio.h. C'est comme NULL pour les pointeurs : c'est 0, mais on le met par convention, pour montrer que c'est bien un pointeur, et non une simple variable !
exit() est souvent utilisé pour sortir d'un programme en cas de problème. On note alors comme cela : exit(EXIT_FAILURE);. On l'utilise dans une condition if() comme dans cet exemple :
int main (int argc, char *argv[])
{
if ( int a = malloc(sizeof(int)) == NULL ) //On alloue et on teste pour voir si malloc renvoie NULL (cas d'erreur)
{
printf("Message d'erreur"); // On affiche "Message d'erreur"
exit(EXIT_FAILURE); // Et on sort. En fait, cette notation équivaut a écrire exit(1); …
}
// Si l'allocation a marché, tu met ton code ici …
return EXIT_SUCCESS; // Qui équivaut toujours a return 0; ...
}
A+ !
-
Contributeurgénéralement, quand tu débutes en C, tu fais des programmes qui se suffisent à eux meme. Donc pas pas très utile de dire au programme appelant comment s'est déroulé l'execution.
Cependant, si tu veux faire propre, tu faire EXIT_SUCCESS quand le programme s'est bien déroulé, et EXIT_FAILURE lorsque le programme a récupéré une erreur ... mais honnetement, c'est pas le plus interessant lorsque tu débutes la programmation ;)-
ah ok, mais alors expliquez moi pourquoi ici il utilise exit(EXIT_FAILURE) alors que le programme se déroule très bien
#include <stdio.h> #include <stdlib.h> #include <unistd.h> int menu(void); int main(void) { int choix; while(1) { choix = menu(); if(choix == 1) { puts("\nExécution de la tache correpondante au choix 1."); sleep(5); } else if( choix == 2) { puts("\nExécution de la tache correpondante au choix 2."); sleep(5); } else if( choix == 3) { puts("\nExécution de la tache correpondante au choix 2."); sleep(5); } else if( choix == 4) { puts("\nExécution de la tache correpondante au choix 2."); sleep(5); } else if( choix == 5) { puts(("\nSortie du programme\n"); sleep(5); break; } else { puts("Choix incorrecte, essayer de nouveau"); sleep(5); } } exit(EXIT_FAILURE); } int menu(void) { int reponse; puts("\nEntrez 1 pour la tache A"); puts("\nEntrez 2 pour la tache B"); puts("\nEntrez 3 pour la tache C"); puts("\nEntrez 4 pour la tache D"); puts("\nEntrez 5 pour sortir du programme"); scanf("%d", &reponse); return reponse; } -
Contributeur@anthonyla personne s'est trompée.
Elle sort de la boucle avec le break, qui est conditionné par une commande utilisateur, donc ca devrait être exit success.
comme il n'y a qu'un type de sortie possible, personnelement, au lieu de
int main(void)
j'aurai mis
void main(void) -
Contributeur@Nabla'sBonjour,
void main(void) n'est pas standard. La norme impose int main(void) en prototype de main sans argument. -
@Nabla'sah ok c'est pour sa que je trouvais bizzard ce code
j'aurai mis void main(void)
ah bon j'ai jamais vue sa, ce que j'ai vue moi c'est int main(int argc, char *argv[]) et int main() ou int main(void) mais ton int connais pas
-
-
ModérateurSalut,
donc il vaut quoi ?
EXIT_FAILURE est défini dans stdlib.h et sa valeur dépends de système, pour assurer la portabilité du code vaut mieux utiliser la constante symbolique -
Oui, exit(EXIT_FAILURE) vaut autre chose que 0 (booléen) ...
-
Bien sur que EXIT_FAILURE et EXIT_SUCCESS sont des int, puisque bool n'existe pas en C … Mais on continue a les voir comme des booléens : 0 et 1 sont des entiers, et en même temps des booléens !
-
ModérateurRe,
Mais on continue a les voir comme des booléens
Seulement dans le cas d'une condition dans if, for, while ou on teste la valeur de vérité et pas la valeur entière.
Le retour de main est un int, un nombre qui est peut être le code de sortie d'un processus fils par exemple et en ce moment ce n'est pas la valeur de vérité qui importe mais la valeur entière.