int fn();
void whatever()
{
(void) fn();
}
Y a-t-il une raison de convertir une valeur de retour inutilisée en annulation, ou ai-je raison de penser que c'est une perte de temps totale?
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 cela ...
Au travail, nous utilisons cela pour reconnaître que la fonction a une valeur de retour, mais le développeur a affirmé qu'il était prudent de l'ignorer. Puisque vous avez marqué la question comme C ++, vous devriez utiliser static_cast :
En ce qui concerne le compilateur, la conversion de la valeur de retour en void n'a pas beaucoup de sens.
la source
La vraie raison de faire cela remonte à un outil utilisé sur le code C, appelé lint .
Il analyse le code à la recherche de problèmes possibles et émet des avertissements et des suggestions. Si une fonction renvoyait une valeur qui n'a pas été vérifiée,
lint
cela avertirait si cela était accidentel. Pour faire tairelint
cet avertissement, vous lancez l'appel à(void)
.la source
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,
Vous pouvez donc écrire:
Tous les formulaires sont valides. Je le raccourcis généralement comme:
C'est aussi bien.
la source
Depuis c ++ 17, nous avons l'
[[maybe_unused]]
attribut qui peut être utilisé à la place duvoid
cast.la source
nodiscard
ce qui peut être intéressant: stackoverflow.com/a/61675726/895245 Aussi je pense que vous ne pouvez pas appliquer[[maybe_unused]]
directement à l'appel il semble, seulement à une variable factice qui accepte le retour de l'appel? Si c'est correct, c'est un peu bancal.Cast to void est gratuit. Ce ne sont que des informations pour le compilateur sur la façon de le traiter.
la source
(void)
me coûte du temps et de l'énergie et je me demande si l'auteur savait comment fonctionnent les expressions.Pour la fonctionnalité de votre programme, le casting pour annuler n'a pas de 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. Ajouter un casting comme celui-ci ne semblera qu'étrange et soulèvera des questions sur la raison possible. Juste mon avis...
la source
For the functionality of you program casting to void is meaningless
Pour l'auto-documentation et le nombre d'avertissements lors de la compilation, ce n'est vraiment pas le cas.you should not use it to signal something to the person that is reading the code [...] it is better to use a comment.
Le meilleur commentaire est pas de commentaire , lorsque le code s'explique. Et, encore une fois, garde un compilateur d'avertissement valide heureux dans le processus.De plus, lors de la vérification de la conformité de votre code 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 qu'elle renvoie une valeur à moins que vous ne convertissiez explicitement la valeur retournée en (void)
la source
C ++ 17
[[nodiscard]]
C ++ 17 a normalisé la "valeur de retour entreprise ignorée" avec un attribut.
Par conséquent, j'espère que les implémentations conformes avertiront toujours seulement quand
nodiscard
est donné, et jamais avertiront autrement.Exemple:
main.cpp
compiler:
résultat:
Les éléments suivants évitent tous l'avertissement:
Je n'ai pas pu utiliser
maybe_unused
directement sur l'f()
appel:donne:
Le
(void)
travail de fonte ne semble pas obligatoire mais est "encouragé" dans la norme: Comment puis-je supprimer intentionnellement une valeur de retour [[nodiscard]]?Comme le montre également le message d'avertissement, une «solution» à l'avertissement consiste à ajouter
-Wno-unused-result
:bien que je ne recommanderais bien sûr pas d'ignorer les avertissements globalement comme celui-ci.
C ++ 20 vous permet également d'ajouter une raison de l'
nodiscard
comme[[nodiscard("reason")]]
mentionné à: https://en.cppreference.com/w/cpp/language/attributes/nodiscardwarn_unused_result
Attribut GCCAvant la standardisation de
[[nodiscard]]
, et pour C, avant de décider finalement de standardiser les attributs, GCC a implémenté exactement la même fonctionnalité avecwarn_unused_result
:qui donne:
Il convient de noter alors que puisque ANSI C n'a pas de norme pour cela, ANSI C ne spécifie pas quelles fonctions de bibliothèque standard C ont l'attribut ou non et par conséquent, les implémentations ont pris leurs propres décisions sur ce qui devrait ou non être marqué
warn_unuesd_result
, qui C'est pourquoi, en général, vous devriez utiliser le(void)
cast pour ignorer les retours de tout appel aux fonctions de bibliothèque standard pour éviter complètement les avertissements dans toute implémentation.Testé dans GCC 9.2.1, Ubuntu 19.10.
la source