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");
}
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 estvoid
.
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).
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
)
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
Le projet de comité ISO/CEI 9899: 201x dit ce qui suit:
6.8.6.4 La déclaration de retour
Contraintes
return
instruction avec une expression ne doit pas apparaître dans une fonction dont le type de retour estvoid
.Une instruction
return
sans expression ne doit apparaître que dans une fonction dont le type de retour estvoid
.
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();
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 estvoid
. Une instructionreturn
sans expression ne doit apparaître que dans une fonction dont le type de retour estvoid
.
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.