5 votes

ne rien retourner d'une fonction non vide en C

Ce qui est considéré comme une bonne pratique dans l'extrait suivant :

int foo(struct data *bar, struct info bla) {
    if (!bar) {
        bla->status = 0;
        return;
    }
    ...
}

En fait, ça fonctionne bien. Mais je me sens mal à l'aise avec gcc en me donnant un avertissement.


Voici le code actuel :

static int pop(struct stack **stack, struct info *info) {
        int ret;
        struct stack *tmp;

        if (!*stack) {
                info->error = 0;
                return;
        }

        ret = (*stack)->data;
        tmp = *stack;
        *stack = (*stack)->next;
        free(tmp);

        return ret;
}

14voto

La meilleure pratique consiste à ne pas écrire un tel code. Si vous ne pouvez pas retourner un entier quelconque à ce stade, vous devez revoir votre code. Notez que la fonction telle qu'elle est écrite sera renvoient une valeur quelconque au code appelant - vous ne savez simplement pas quelle sera cette valeur.

Le moyen classique de contourner ce problème est de renvoyer la valeur via un paramètre pointeur, la fonction réelle renvoyant un état :

int f( int * p ) {
   if ( bad ) {
       return 0;   // fail indicator
   }
   else {
      * p = 42;    // integer return value
      return 1;    // success indicator
   }
}

Editar: Dans le code que vous avez posté, vous manipulez une pile. L'extraction d'une pile vide est un comportement indéfini pour toutes les piles que je connais, donc vous pouvez simplement retourner n'importe quel entier qui vous plaît (je retournerais 0) et documenter le comportement.

6voto

harald Points 3790

Le comportement est indéfini, et l'avertissement est là pour une bonne raison ! Renvoyez une valeur, ou transformez la fonction en une fonction void.

1voto

Secure Points 2838

En supposant que la valeur de retour n'est pas utilisé pour ce cas spécifique il suffit de retourner 0. Si la valeur de retour est utilisée, il y a un sérieux défaut dans la logique de votre programme qui doit être corrigé en premier lieu.

0voto

Svisstack Points 9001

Type return 0; o return -1; si c'est une erreur et que vos entiers sans erreur sont signés positivement.

0voto

Tapdingo Points 239

Si vous ne pouvez rien retourner, vous pouvez envisager de lever une exception ou, comme nous l'avons déjà dit, de revoir votre code.

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