Exit() en C

Résolu
Bonjour,
J'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

Résumé de la discussion

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.

Bobot (l’IA à votre service)
  1. Contributeur
    exit(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,
    1. ok EXIT_SUCCESS vaut 0
      En revanche, rien ne dit dans la norme EXIT_FAILURE vale 1. 

      donc il vaut quoi ?
  2. 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+ !
    1. Contributeur
      gé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 ;)
      1. 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;
        }
        
      2. 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)
      3. Contributeur
        @Nabla'sBonjour,
        void main(void) n'est pas standard. La norme impose int main(void) en prototype de main sans argument.
      4. @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
    2. Modérateur
      Salut,

      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
      1. Oui, exit(EXIT_FAILURE) vaut autre chose que 0 (booléen) ...
        1. Modérateur
          Re,

          En fait EXIT_SUCCESS vaut 0 qui est un entier et pas un booléen, d'ailleurs le type de main est int.

          Ce que tu dois retenir ce n'est pas la valeur mais le fait que EXIT_SUCCESS signifie la réussite et EXIT_FAILURE signifie l'échec.

      2. 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 !
        1. Contributeur
          puisque bool n'existe pas en C
          En C99, le booléen existe. Son type est _Bool et c'est défini dans stdbool.h

          0 et 1 sont des entiers, et en même temps des booléens !
          Non, 0 et 1 sont des int, tout comme 'f' est un int (et non un char).
        2. @fiddyJe parle dans la vrai vie, pas en prog' ...
        3. Modérateur
          @AttaquaRe,

          Dans la vraie vie parle de booléen à ma mère et tu verras ;-)
        4. @lami20jCe n'est pas seulement une notion de prog' ...
        5. Contributeur
          @AttaquaLe topic de cette conversation, c'est le C.
          Si après, c'est pour parler dans la vie, on peut dire aussi que 0 et 1 sont des chiffres... Nous voilà bien avancés...
      3. Modérateur
        Re,

        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.
        1. ah ok donc en gros EXIT_SUCCESS = réussite et EXIT_FAILURE = echec, je vais plutôt retenir sa
        2. @anthonyah oui et désoler mais je n'arrive pas a mettre le sujet résolue car il mette pas le choix
        3. Modérateur
          @anthonySalut,

          je n'arrive pas a mettre le sujet résolue
          C'est fait ;-)