J'ai une application multiplateforme et dans certaines de mes fonctions, toutes les valeurs transmises aux fonctions ne sont pas utilisées. Par conséquent, je reçois un avertissement de GCC me disant qu'il y a des variables inutilisées.
Quelle serait la meilleure façon de coder autour de l'avertissement?
Un #ifdef autour de la fonction?
#ifdef _MSC_VER
void ProcessOps::sendToExternalApp(QString sAppName, QString sImagePath, qreal qrLeft, qreal qrTop, qreal qrWidth, qreal qrHeight)
#else
void ProcessOps::sendToExternalApp(QString sAppName, QString sImagePath, qreal /*qrLeft*/, qreal /*qrTop*/, qreal /*qrWidth*/, qreal /*qrHeight*/)
#endif
{
C'est si moche mais cela ressemble à la façon dont le compilateur préférerait.
Ou dois-je affecter zéro à la variable à la fin de la fonction? (ce que je déteste parce qu'il modifie quelque chose dans le flux du programme pour faire taire un avertissement du compilateur).
Existe-t-il une manière correcte?
c++
gcc
warnings
gcc-warning
Phil Hannent
la source
la source
Q_UNUSED
macro juste pour cela. Vérifiez-le dans la documentation.Réponses:
Vous pouvez le placer dans l'
(void)var;
expression " " (ne fait rien) pour qu'un compilateur voit qu'il est utilisé. C'est portable entre les compilateurs.Par exemple
Ou,
la source
Q_UNUSED
principe est mis en œuvre.#define UNUSED(expr) (void)(expr)
devrait aussi fonctionner (sans le temps nécessaire).template<typename... Args> void f(const Args&... args)
Je ne peux pas écrire(void)args;
ou(void)args...;
parce que les deux sont des erreurs de syntaxe.Dans GCC et Clang, vous pouvez utiliser la
__attribute__((unused))
directive du préprocesseur pour atteindre votre objectif.Par exemple:
la source
C ++ 17 fournit désormais l'
[[maybe_unused]]
attribut.http://en.cppreference.com/w/cpp/language/attributes
Assez agréable et standard.
la source
Votre solution actuelle est la meilleure - commentez le nom du paramètre si vous ne l'utilisez pas. Cela s'applique à tous les compilateurs, vous n'avez donc pas besoin d'utiliser le pré-processeur pour le faire spécialement pour GCC.
la source
g++
avertit.) Dans un tel cas, que recommanderiez-vous?Mise à jour C ++ 17
En C ++ 17, nous obtenons l'attribut [[peut-être_unused]] qui est couvert dans [dcl.attr.unused]
Pour l'exemple suivant:
Clang et gcc génèrent tous deux un diagnostic à l'aide de -Wall -Wextra à la fois pour la barre et la barre inutilisée ( voir en direct ).
Lors de l'ajout de [[peut-être_unused]], les diagnostics sont réduits au silence:
voir en direct .
Avant C ++ 17
En C ++ 11, une forme alternative de la
UNUSED
macro pourrait être formée en utilisant une expression lambda ( via Ben Deane ) avec une capture de la variable inutilisée:L'invocation immédiate de l'expression lambda doit être optimisée, dans l'exemple suivant:
on peut voir dans godbolt que l'appel est optimisé loin:
la source
template <class T> inline void NOTUSED( T const & result ) { static_cast<void>(result); }
Vous pouvez également utiliser un lambda dans la fonction, je suppose.[&x]{}()
ne fait pas vraiment taire l'avertissement, mais transmet plutôt l'avertissement de la fonction d'appel à la lambda Cela prendra du temps jusqu'à ce que les compilateurs identifient cela comme un avertissement, mais Clang-Tidy se plaint déjà d'une variable inutilisée dans la liste de capture.Une façon encore plus propre consiste à simplement commenter les noms de variables:
la source
#if 0 / #endif
les commentaires de bloc.Un collègue vient de me montrer cette jolie petite macro ici
Pour plus de facilité, je vais inclure la macro ci-dessous.
la source
gccne signale pas ces avertissements par défaut. Cet avertissement doit avoir été activé explicitement en passant
-Wunused-parameter
au compilateur ou implicitement en passant-Wall -Wextra
(ou éventuellement une autre combinaison d'indicateurs).Les avertissements de paramètres inutilisés peuvent simplement être supprimés en passant
-Wno-unused-parameter
au compilateur, mais notez que cet indicateur de désactivation doit venir après tout indicateur d'activation possible pour cet avertissement dans la ligne de commande du compilateur, afin qu'il puisse prendre effet.la source
moyen sans macro et portable pour déclarer un ou plusieurs paramètres comme inutilisés:
la source
L'utilisation de directives de préprocesseur est considérée comme malfaisante la plupart du temps. Idéalement, vous voulez les éviter comme le ravageur. N'oubliez pas qu'il est facile de faire comprendre votre code au compilateur, ce qui permet aux autres programmeurs de comprendre votre code est beaucoup plus difficile. Quelques dizaines de cas comme celui-ci ici et là, il est très difficile à lire pour vous-même plus tard ou pour d'autres en ce moment.
Une façon pourrait être de rassembler vos paramètres dans une sorte de classe d'arguments. Vous pouvez alors utiliser uniquement un sous-ensemble de variables (équivalent à votre affectation réelle de 0) ou avoir différentes spécialisations de cette classe d'arguments pour chaque plate-forme. Cela pourrait cependant ne pas en valoir la peine, vous devez analyser si cela conviendrait.
Si vous pouvez lire des modèles impossibles, vous trouverez peut-être des conseils avancés dans le livre "Exceptional C ++". Si les gens qui liraient votre code pourraient obtenir leur compétence pour englober les trucs fous enseignés dans ce livre, alors vous auriez un beau code qui peut également être facilement lu. Le compilateur serait également bien conscient de ce que vous faites (au lieu de tout cacher en prétraitant)
la source
#define UNUSED(expr) (void)(expr)
appropriée.Tout d'abord, l'avertissement est généré par la définition de variable dans le fichier source et non dans le fichier d'en-tête. L'en-tête peut rester vierge et devrait, car vous pourriez utiliser quelque chose comme doxygen pour générer la documentation de l'API.
Je suppose que vous avez une implémentation complètement différente dans les fichiers source. Dans ces cas, vous pouvez soit commenter le paramètre incriminé, soit simplement écrire le paramètre.
Exemple:
Cela peut sembler cryptique, a donc défini une macro comme UNUSED. Voici comment MFC l'a fait:
Comme cela, vous voyez l'avertissement toujours dans les versions de débogage, peut être utile.
la source
N'est-il pas sûr de toujours commenter les noms des paramètres? Si ce n'est pas le cas, vous pouvez faire quelque chose comme
C'est un peu moins moche.
la source
J'ai vu cela au lieu de la
(void)param2
façon de faire taire l'avertissement:On dirait que cela a été ajouté en C ++ 11
la source
Utiliser un
UNREFERENCED_PARAMETER(p)
pourrait fonctionner. Je sais qu'il est défini dans WinNT.h pour les systèmes Windows et peut également être facilement défini pour gcc (s'il ne l'a pas déjà).UNREFERENCED PARAMETER(p)
est défini commedans WinNT.h.
la source
Utilisez l'indicateur du compilateur, par exemple l'indicateur pour GCC:
-Wno-unused-variable
la source
Vous pouvez utiliser
__unused
pour indiquer au compilateur que la variable peut ne pas être utilisée.la source
__unused
n'est pas du C ++ standard, et plus précisément, ce que vous avez publié non plus ... C'est Objective-C. Cette réponse n'est donc vraiment utile que pour des compilateurs spécifiques, et elle rend le code non portable, et en fait pas vraiment valide car le code utilisateur n'est pas destiné à utiliser des identificateurs commençant par__
, qui sont réservés à l'implémentation.En C ++ 11, voici la solution que j'utilise:
Vérifié pour être portable (au moins sur msvc moderne, clang et gcc) et ne pas produire de code supplémentaire lorsque les optimisations sont activées. Sans optimisation, l'appel de fonction supplémentaire est effectué et les références aux paramètres sont copiées dans la pile, mais aucune macro n'est impliquée.
Si le code supplémentaire pose problème, vous pouvez utiliser cette déclaration à la place:
mais à ce stade, une macro offre une meilleure lisibilité:
la source
Cela fonctionne bien mais nécessite C ++ 11
la source
ALLCAPS
pour autre chose que les macros, ce qui les rend laides et indésirables, mais il n'y a vraiment rien de mal à cela, sauf que cestatic_cast
serait plus agréable.J'ai trouvé que la plupart des réponses présentées ne fonctionnent que pour la variable locale inutilisée et entraîneront une erreur de compilation pour la variable globale statique inutilisée.
Une autre macro devait supprimer l'avertissement de variable globale statique inutilisée.
Cela fonctionne car aucun avertissement ne sera signalé pour la variable globale non statique dans l'espace de noms anonyme.
C ++ 11 est cependant requis
la source
Lol! Je ne pense pas qu'il y ait une autre question sur SO qui révèle tous les hérétiques corrompus par le Chaos mieux que celui-ci!
Avec tout le respect que je dois à C ++ 17, il y a une ligne directrice claire dans C ++ Core Guidelines . AFAIR, en 2009, cette option était disponible ainsi qu'aujourd'hui. Et si quelqu'un dit que c'est considéré comme un bug dans Doxygen, alors il y a un bug dans Doxygen
la source
Je ne vois pas votre problème avec l'avertissement. Documentez dans l'en-tête méthode / fonction que le compilateur xy émettra un avertissement (correct) ici, mais que ces variables sont nécessaires pour la plateforme z.
L'avertissement est correct, pas besoin de le désactiver. Cela n'invalide pas le programme - mais il doit être documenté, qu'il y a une raison.
la source