65 votes

Retourner le type void en C et C++

Ceci compile sans avertissement.

Est-ce légal en C et C++ ou est-ce juste un fonctionnement de gcc et clang?

Si c'est légal, est-ce une nouvelle chose après C99?

void f(){

}

void f2(){
    return f();
}

Mise à jour

comme l'a suggéré "Rad Lexus" j'ai essayé ceci:

$ gcc -Wall -Wpedantic -c x.c 
x.c: In function ‘f2’:
x.c:7:9: warning: ISO C forbids ‘return’ with expression, in function returning void [-Wpedantic]
  return f();

$ clang -Wall -Wpedantic -c x.c 
x.c:7:2: warning: void function 'f2' should not return void expression [-Wpedantic]
        return f();
        ^      ~~~~~
1 warning generated.

$ gcc -Wall -Wpedantic -c x.cc
(aucune erreur)

$ clang -Wall -Wpedantic -c x.cc
(aucune erreur)

Mise à jour

Quelqu'un a demandé comment cette construction aide. Eh bien, c'est plus ou moins du sucre syntaxique. Voici un bon exemple:

void error_report(const char *s){
    printf("Error %s\n", s);
    exit(0);
}

void process(){
   if (step1() == 0)
      return error_report("Step 1");

   switch(step2()){
   case 0: return error_report("Step 2 - Pas de mémoire");
   case 1: return error_report("Step 2 - Erreur interne");
   }

   printf("Traitement terminé!\n");
}

71voto

DevSolar Points 18897

C11, 6.8.6.4 "L'instruction return":

Une instruction return avec une expression ne doit pas apparaître dans une fonction dont le type de retour est void.

Non, vous ne pouvez pas utiliser une expression, même si elle est de type void.

Dans l'avant-propos du même document:

Les changements majeurs dans la deuxième édition comprenaient:

[...]

  • return sans expression non autorisé dans une fonction qui renvoie une valeur (et vice versa)

Il s'agit donc d'un changement de C89 -> C99 (la deuxième édition de la norme du langage), et cela a été ainsi depuis lors.


C++14, 6.6.3 "L'instruction return":

Une instruction de retour avec une expression de type non-void ne peut être utilisée que dans des fonctions renvoyant une valeur [...] Une instruction de retour avec une expression de type void ne peut être utilisée que dans des fonctions avec un type de retour de cv void; l'expression est évaluée juste avant que la fonction ne renvoie à son appelant.

Oui, vous pouvez utiliser une expression si elle est de type void (ce qui est valide depuis C++98).

15voto

Mohit Jain Points 6202

Ce code est autorisé en C++ mais n'est pas autorisé en C

De Déclaration de retour @ cppreference

Dans une fonction retournant void, la déclaration de retour avec expression peut être utilisée, si le type de l'expression est void.


D'un autre côté, dans le projet de spécifications C11 n1570 :

Les principaux changements de la seconde édition inclus:

Le retour sans expression n'est pas autorisé dans une fonction qui retourne une valeur (et vice versa)

(return avec expression n'est pas autorisé dans une fonction qui retourne un void)

et 6.8.6.4 return

Une déclaration de retour avec une expression ne doit pas apparaître dans une fonction dont le type de retour est void. Une déclaration de retour sans expression ne doit apparaître que dans une fonction dont le type de retour est void.

(même si l'expression est évaluée à void)

5voto

black Points 2917

C++ permet quelque chose comme ça:

void f() 
{
    return void();
}

Alors que le langage C ne le permet pas. C'est pourquoi un avertissement est émis si vous le compilez en ISO C plutôt qu'en ISO C++. Ceci est formellement décrit comme suit:

Une instruction de retour avec une expression de type void ne peut être utilisée que dans les fonctions avec un type de retour de cv void

3voto

Antti Haapala Points 11542

Le brouillon du Comité ISO/IEC 9899:201x dit ce qui suit :

6.8.6.4 L'instruction return

Contraintes

  1. L'instruction return avec une expression ne doit pas apparaître dans une fonction dont le type de retour est void.

    Une instruction return sans expression ne doit apparaître que dans une fonction dont le type de retour est void.

Donc, c'est interdit en C.


Vous devez utiliser l'option -pedantic avec gcc pour qu'il se plaigne des violations de la norme :

test.c: Dans la fonction ‘f2’ :
test.c:6:12: avertissement : C ISO interdit le ‘return’ avec une expression, dans une fonction renvoyant void 
            [-Wpedantic]
     return f();

1voto

chqrlie Points 17105

Le langage C standard ne prend pas en charge cette construction :

C11 6.8.6.4 : L'instruction return

Contraintes

1 Une instruction return avec une expression ne doit pas apparaître dans une fonction dont le type de retour est void. Une instruction return sans expression ne doit apparaître que dans une fonction dont le type de retour est void.

Aucune disposition spéciale n'est ajoutée pour le cas spécial mentionné dans la question. Certains compilateurs C prennent en charge cette fonctionnalité en tant qu'extension (gcc le fait, sauf s'ils sont instruits de se conformer à l'une des normes C), mais les normes C11 et versions antérieures considèrent cela comme une violation de contrainte.

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