web-dev-qa-db-fra.com

Pourquoi convertir les valeurs de retour inutilisées en null?

int fn();

void whatever()
{
    (void) fn();
}

Y a-t-il une raison pour annuler une valeur de retour inutilisée, ou ai-je raison de penser que c'est une perte de temps complète?

Suivre:

Eh bien, cela semble assez complet. Je suppose que c'est mieux que de commenter une valeur de retour inutilisée car le code auto-documenté est meilleur que les commentaires. Personnellement, je désactiverai ces avertissements car il s'agit d'un bruit inutile.

Je vais manger mes mots si un insecte s'échappe à cause de ça ...

104
markh44

David's answer couvre à peu près la motivation pour cela, pour montrer explicitement aux autres "développeurs" que vous savez que cette fonction retourne mais vous l'ignorez explicitement.

C'est un moyen de garantir que les codes d'erreur, le cas échéant, sont toujours traités.

Je pense que pour C++, c'est probablement le seul endroit où je préfère utiliser les transtypages de style C, car l'utilisation de la notation de transtypage statique complète se sent comme exagérée ici. Enfin, si vous examinez une norme de codage ou que vous en rédigez une, il est également judicieux d'indiquer explicitement que les appels aux opérateurs surchargés (n'utilisant pas la notation d'appel de fonction) devraient également en être exemptés:

class A {};
A operator+(A const &, A const &);

int main () {
  A a;
  a + a;                 // Not a problem
  (void)operator+(a,a);  // Using function call notation - so add the cast.
72
Richard Corden

Au travail, nous utilisons cela pour reconnaître que la fonction a une valeur de retour, mais le développeur a affirmé qu'il est sûr de l'ignorer. Puisque vous avez marqué la question en C++, vous devez utiliser static_cast:

static_cast<void>(fn());

En ce qui concerne le compilateur, la conversion de la valeur de retour en void a peu de sens.

43
David Holm

La vraie raison de cela remonte à un outil utilisé sur le code C, appelé lint .

Il analyse le code à la recherche d'éventuels problèmes et émet des avertissements et des suggestions. Si une fonction renvoyait une valeur qui n'était alors pas vérifiée, lint avertirait en cas d'accident. Pour désactiver lint sur cet avertissement, vous lancez l'appel à (void).

35
Daniel Earwicker

La conversion en void est utilisée pour supprimer les avertissements du compilateur pour les variables inutilisées et les valeurs ou expressions de retour non enregistrées.

La norme (2003) dit au §5.2.9/4:

Toute expression peut être explicitement convertie en type "cv void". La valeur de l'expression est rejetée.

Vous pouvez donc écrire:

//suppressing unused variable warnings
static_cast<void>(unusedVar);
static_cast<const void>(unusedVar);
static_cast<volatile void>(unusedVar);

//suppressing return value warnings
static_cast<void>(fn());
static_cast<const void>(fn());
static_cast<volatile void>(fn());

//suppressing unsaved expressions
static_cast<void>(a + b * 10);
static_cast<const void>( x &&y || z);
static_cast<volatile void>( m | n + fn());

Tous les formulaires sont valables. Je le raccourcis généralement comme:

//suppressing  expressions
(void)(unusedVar);
(void)(fn());
(void)(x &&y || z);

C'est aussi bien.

22
Nawaz

Car la fonctionnalité de votre programme de casting to void n'a aucun sens. Je dirais également que vous ne devriez pas l'utiliser pour signaler quelque chose à la personne qui lit le code, comme suggéré dans la réponse de David. Si vous souhaitez communiquer quelque chose sur vos intentions, il est préférable d'utiliser un commentaire. L'ajout d'un casting comme celui-ci ne fera que paraître étrange et soulèvera des questions sur la raison possible. Juste mon avis...

4
Dani van der Meer

Je sais que c'est un vieux fil, mais le langage évolue et il convient de mentionner ici pour être complet que depuis c ++ 17 nous avons le [[maybe_unused]] attribut qui peut être utilisé à la place du transtypage void.

4
florestan

Cast to void est gratuit. Ce n'est qu'une information pour le compilateur comment le traiter.

3
klew

En C, il est parfaitement OK de lancer pour annuler. Presque tout le monde comprendra l'intention de la déclaration.

En C++, vous avez d'autres outils à votre disposition. Étant donné que les transtypages C sont généralement désapprouvés et que la conversion explicite en null surprendra probablement vos collègues (cela surprend le mien), j'ai ce modèle de fonction quelque part

template <typename T>
void use_expression(const T&) {}

et j'utilise

...
use_expression(foo());

où j'écrirais (void)foo() en C.

3
Alexandre C.

De plus, lorsque vous vérifiez que votre code est conforme aux normes MISTA (ou autres), les outils automatiques tels que LDRA ne vous permettront pas d'appeler une fonction qui a un type de retour sans lui faire renvoyer une valeur, sauf si vous convertissez explicitement la valeur retournée en (void)

1
Versatile