Supprimer l'avertissement de variable inutilisée dans C ++ = & gt; Bug de compilateur ou bug de code?
Actuellement, je suis en utilisant la fonction suivante modèle de supprimer inutilisé de la variable de mises en garde:
template<typename T>
void
unused(T const &) {
/* Do nothing. */
}
Toutefois, en cas de portage à cygwin à partir de Linux, je suis maintenant en train d'erreurs du compilateur g++ 3.4.4 (Sur linux, je suis 3.4.6, c'est peut-être une correction de bug?):
Write.cpp: In member function `void* Write::initReadWrite()':
Write.cpp:516: error: invalid initialization of reference of type 'const volatile bool&' from expression of type 'volatile bool'
../../src/common/Assert.h:27: error: in passing argument 1 of `void unused(const T&) [with T = volatile bool]'
make[1]: *** [ARCH.cygwin/release/Write.o] Error 1
L'argument de la partie inutilisée est un membre de la variable déclarée comme:
volatile bool readWriteActivated;
Est-ce un bug du compilateur ou un bug dans mon code?
Ici est le minimum de cas de test:
template<typename T>
void unused(T const &) { }
int main() {
volatile bool x = false;
unused(!x); //type of "!x" is bool
}
source d'informationauteur WilliamKF
Vous devez vous connecter pour publier un commentaire.
La manière de vous indiquer que vous n'avez pas utiliser un paramètre n'est pas en lui donnant un nom:
compiler partout avec tous les avertissements allumé, sans avertissement, sur le solde non utilisé du flotteur. Même si l'argument ne ont un nom dans le prototype (par exemple
int f(int a, float f);
), il ne veut toujours pas se plaindre.Je ne suis pas sûr à 100% que ce est portable, mais c'est le langage que j'ai utilisé habituellement pour la suppression des avertissements sur les variables. Le contexte ici est un gestionnaire de signal qui est utilisé uniquement pour attraper
SIGINT
etSIGTERM
donc si la fonction n'est jamais appelée, je sais qu'il est temps pour le programme de la sortie.J'ai tendance à détester encombrer la liste des paramètres avec
__attribute__((unused))
depuis le cast-à-void truc qui fonctionne sans avoir recours à des macros pour Visual C++.C'est un bug du compilateur et il n'existe pas de solutions:
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42655
Il est fixé dans la v4.4.
Dans GCC, vous pouvez définir une macro comme suit:
Tous les paramètres marqués avec cette macro va supprimer le solde non utilisé d'avertissement GCC émet (et renomme le paramètre avec un préfixe de
UNUSED_
). Pour Visual Studio, vous pouvez supprimer les avertissements avec un#pragma
directive.La réponse proposée par haavee (modifié par ur) est celui que je voudrais l'utiliser normalement:
Le vrai problème se produit lorsque l'argument est parfois mais pas toujours utilisées dans la méthode, par exemple:
Maintenant, je ne peux pas en commentaire le nom du paramètre epsilon parce que cela va me casser la journalisation de construire (je ne veux pas d'insérer un autre #ifdef dans la liste d'arguments, parce que cela rend le code beaucoup plus difficile à lire).
Donc je pense que la meilleure solution serait d'utiliser de Tom suggestion:
Mon seul souci serait que certains compilateurs peuvent avertir à propos de l' "(void) epsilon;" instruction, par exemple, "l'instruction n'a pas d'effet" d'avertissement " ou quelque chose comme ça - je pense que je vais tester sur tous les compilateurs, je suis susceptible d'utiliser...