Ce n'casting de "void" vraiment?
Souvent utilisé déclaration comme (void)x;
permet de supprimer les avertissements sur unused variable x
. Mais si j'essaie de compiler le suivant, je obtenir certains résultats, je ne comprends pas très bien:
int main()
{
int x;
(short)x;
(void)x;
(int)x;
}
De la compilation avec g++, je reçois les mises en garde suivantes:
$ g++ test.cpp -Wall -Wextra -o test
test.cpp: In function ‘int main()’:
test.cpp:4:13: warning: statement has no effect [-Wunused-value]
(short)x;
^
test.cpp:6:11: warning: statement has no effect [-Wunused-value]
(int)x;
^
J'en conclus que la coulée de void
est très différente de la conversion d'autres types, être le type de cible le même que decltype(x)
ou quelque chose de différent. Je pense à des explications possibles est:
- C'est juste une convention qui
(void)x;
mais pas les autres distributions qui va supprimer les avertissements. Toutes les déclarations tout aussi de ne pas avoir d'effet. - Cette différence est en quelque sorte lié au fait que
void x;
n'est pas une instruction valide alors queshort x;
est.
Laquelle de ces si tout est correct? Si aucun, alors comment peut-on la différence dans les avertissements du compilateur être expliqué?
- C'est juste une convention entre les compilateurs que cette distribution supprime les avertissements. La Norme C++ ne fait pas mention de mises en garde pour "l'instruction n'a pas d'effet" à tous.
Vous devez vous connecter pour publier un commentaire.
Casting à vide est utilisé pour supprimer les avertissements du compilateur. Le Standard dit au §5.2.9/4 dit,
Cette déclaration:
Dit "Ignorer la valeur de x". Il n'y a pas ce type comme
void
- c'est l'absence d'un type. Il est donc très différente de ce:Qui dit "considère x comme si c'était un nombre entier." Lorsque l'entier résultant est ignoré, vous obtenez un avertissement (si elle est activée).
Lorsque vous ignorez quelque chose qui n'est rien, il n'est pas considéré comme un problème par GCC-et avec raison, puisque la coulée à vide est un idiomatiques façon d'ignorer une variable de manière explicite dans le C et le C++.
void
?void
". Voir [de base.types].(void)foo()
) pour dire que vous êtes volontairement abstraction de la valeur de retour. Le seul moment où je peux l'image de la coulée d'une variable est nulle si la variable est utilisée uniquement à l'intérieur de certaines des #ifdef code, et vous souhaitez supprimer l'avertissement lorsque le code n'est pas inclus.assert()
serait de produire des avertissements dans les versions release.La norme ne précise pas la génération d'un avertissement ("diagnostic" dans standardese) pour les variables locales ou des paramètres de la fonction. De même, il ne prévoit pas comment une telle mise en garde pourrait être supprimée. Casting d'une expression variable de
void
pour supprimer cette alerte est devenu un idiome dans le C et, plus tard, C++ de la communauté au lieu de cela, car le résultat ne peut pas être utilisé de quelque façon (autres que, par exemple,(int)x
), il est donc peu probable que le code correspondant est simplement manquantes. E. g.:Personnellement, je trouve cette convention trop obscure encore, c'est pourquoi je préfère utiliser un modèle de fonction:
La idiomatiques façon d'ignorer les paramètres de la fonction est, cependant, d'omettre leur nom (comme vu ci-dessus). Une utilisation fréquente que j'ai pour cette fonction, c'est quand j'ai besoin d'être en mesure de nom de paramètre d'une fonction dans conditionnellement code compilé comme un
assert
. Je trouve par exemple la suite plus lisible que l'utilisation de#ifdef NDEBUG
:[[maybe_unused]]
attribut au lieu de tous ces "créatifs" des manières d'ignorer un paramètre.Utilisation Possible:
Maintenant l'itérateur, "elle", pointe vers le dernier élément