web-dev-qa-db-fra.com

Renvoie le type void en C et C ++

Cela se compile sans aucun avertissement.

Est-ce légal en C et C++ ou fonctionne-t-il simplement en gcc et clang?

Si c'est légal, est-ce quelque chose de nouveau après C99?

void f(){

}

void f2(){
    return f();
}

Mise à jour

comme "Rad Lexus" l'a suggéré, 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
(no errors)

$ clang -Wall -Wpedantic -c x.cc
(no errors)

Mise à jour

Quelqu'un a demandé en quoi cette construction aide. Eh bien, c'est du sucre plus ou moins 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 - No Memory");
   case 1: return error_report("Step 2 - Internal Error");
   }

   printf("Processing Done!\n");
}
65
Nick

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.

Extrait de l'avant-propos du même document:

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

[...]

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

Il s'agissait donc d'un changement par rapport à C89 -> C99 (la deuxième édition de la norme linguistique), et il en a été ainsi depuis.


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

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

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

71
DevSolar

Ce code est autorisé dans C++ mais non autorisé dans C

De instruction Return @ cppreference

Dans une fonction retournant void, l'instruction return avec expression peut être utilisée, si le type d'expression est void.


OTOH dans C11 spécifications projet n1570:

Les principaux changements de la deuxième édition comprenaient:

retour sans expression non autorisé dans la fonction qui retourne une valeur (et vice versa)

(return avec une expression non autorisée dans la fonction qui renvoie un void)

et 6.8.6.4 retour

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

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

15
Mohit Jain

C++ permet quelque chose comme ça:

void f() 
{
    return void();
}

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

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

5
edmz

Le projet de comité ISO/CEI 9899: 201x dit ce qui suit:

6.8.6.4 La déclaration de retour

Contraintes

  1. return instruction 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 -pedantic passez à gcc pour qu'il se plaigne des violations standard:

test.c: In function ‘f2’:
test.c:6:12: warning: ISO C forbids ‘return’ with expression, in function returning void 
            [-Wpedantic]
     return f();
3
Antti Haapala

La norme C 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 particulière n'est ajoutée pour le cas particulier en question. Certains compilateurs C le prennent en charge comme une extension (gcc le fait, sauf si on leur demande de se conformer à l'une des normes C), mais C11 et les versions précédentes le considèrent comme une violation de contrainte.

1
chqrlie