Comment désactiver les avertissements de variables inutilisées provenant de gcc dans un code tiers que je ne souhaite pas modifier?

93

J'aimerais savoir quel commutateur vous passez au compilateur gcc pour désactiver les avertissements de variables inutilisées? Je reçois des erreurs de boost sur Windows et je ne veux pas toucher au code de boost:

C:\boost_1_52_0/boost/system/error_code.hpp: At global scope:
C:\boost_1_52_0/boost/system/error_code.hpp:214:36: error: 'boost::system::posix_category' defined but not used [-Werror=unused-variable]
C:\boost_1_52_0/boost/system/error_code.hpp:215:36: error: 'boost::system::errno_ecat' defined but not used [-Werror=unused-variable]
C:\boost_1_52_0/boost/system/error_code.hpp:216:36: error: 'boost::system::native_ecat' defined but not used [-Werror=unused-variable]

J'ai essayé d'utiliser les deux -Wunused-valueet -Wno-unused-valuemais aucun n'a supprimé les messages ci-dessus.

Quelle est la bonne commande, voici ma ligne de compilation:

g++  -g -fno-inline -Wall -Werror -Wextra -Wfloat-equal -Wshadow
-Wpointer-arith -Wcast-qual -Wcast-align -Wwrite-strings -Wno-conversion 
-Wdisabled-optimization -Wredundant-decls -Wunused-value -Wno-deprecated 
-IC:\\boost_1_52_0 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 
-c -o op.o op.cpp

Peut-être que cela -Walldépasse mon objectif?

WilliamKF
la source
Comme le message d'erreur l'indique plus ou moins, essayez-Werror=no-unused-variable
Joachim Isaksson

Réponses:

236

Le -Wno-unused-variablecommutateur fait généralement l'affaire. Cependant, c'est un avertissement très utile si vous vous souciez de ces choses dans votre projet. Cela devient ennuyeux quand GCC commence à vous avertir de choses qui ne sont pas dans votre code.

Je vous recommande de garder l'avertissement activé, mais d'utiliser -isystemau lieu de -Ipour inclure les répertoires de projets tiers. Ce drapeau dit à GCC de ne pas vous avertir des choses sur lesquelles vous n'avez aucun contrôle.

Par exemple, au lieu de -IC:\\boost_1_52_0, disons -isystem C:\\boost_1_52_0.

J'espère que ça aide. Bonne chance!


la source
Où ajouter ce paramètre? Je l'ai fait sous "Paramètres du projet / Compilateur AVR GNU C / Divers" mais il sera ignoré (le chemin est correct, toujours des avertissements) Lors de l'ajout de cela aux paramètres du répertoire (décochez la case du chemin relatif), AtmelStudio plantera.
hfrmobile
3
nous avons également -Wno-unused-parameterpour les paramètres de fonction inutilisés, -Wno-unused-functionpour les fonctions inutilisées
Ngo Thanh Nhan
1
Vous avez besoin de:-Wno-unused-but-set-variable -Wno-unused-parameter -Wno-unused-variable
Ronny Sherer
82

Parfois, vous avez juste besoin de supprimer uniquement certains avertissements et vous voulez conserver d'autres avertissements, juste pour être sûr. Dans votre code, vous pouvez supprimer les avertissements pour les variables et même les paramètres formels en utilisant l' attribut non utilisé de GCC . Disons que vous avez cet extrait de code:

void func(unsigned number, const int version)
{
  unsigned tmp;
  std::cout << number << std::endl;
}

Il peut y avoir une situation où vous devez utiliser cette fonction comme gestionnaire - ce qui (à mon humble avis) est assez courant dans la bibliothèque C ++ Boost. Ensuite, vous avez besoin de la deuxième version de paramètre formel , de sorte que la signature de la fonction est la même que le modèle requis par le gestionnaire, sinon la compilation échouerait. Mais vous n'en avez pas vraiment besoin non plus dans la fonction elle-même ...

La solution pour marquer la variable ou le paramètre formel à exclure des avertissements est la suivante:

void func(unsigned number, const int version __attribute__((unused)))
{
  unsigned tmp __attribute__((unused));
  std::cout << number << std::endl;
}

GCC a de nombreux autres paramètres, vous pouvez les vérifier dans les pages de manuel . Cela fonctionne également pour les programmes C, pas seulement pour C ++, et je pense qu'il peut être utilisé dans presque toutes les fonctions, pas seulement les gestionnaires. Allez-y et essayez-le! ;)

PS: Dernièrement, j'ai utilisé ceci pour supprimer les avertissements de sérialisation de Boosts dans un modèle comme celui-ci:

template <typename Archive>
void serialize(Archive &ar, const unsigned int version __attribute__((unused)))

EDIT: Apparemment, je n'ai pas répondu à votre question comme vous en aviez besoin, drak0sha l'a fait mieux. C'est parce que j'ai principalement suivi le titre de la question, mon mauvais. J'espère que cela pourrait aider d'autres personnes, qui arrivent ici à cause de ce titre ... :)

Dee'Kej
la source
7
Pour les paramètres formels, vous pouvez omettre le nom, par exemple void func(unsigned number, const int). Ensuite, gcc ne se plaindra pas non plus de l'inutilisé version.
Olaf Dietsche
@OlafDietsche Je pense que cela dépend de la gccversion que vous utilisez. IIRC, j'ai dû l'utiliser il y a 4 ans, pour supprimer les avertissements de non-utilisation version. ;)
Dee'Kej
66

Si vous utilisez gcc et que vous souhaitez désactiver l'avertissement pour le code sélectionné, vous pouvez utiliser la directive du compilateur #pragma:

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-variable"
( your problematic library includes )
#pragma GCC diagnostic pop

Pour le code que vous contrôlez, vous pouvez également utiliser __attribute__((unused))pour indiquer au compilateur que des variables spécifiques ne sont pas utilisées.

Ole Wolf
la source
En général, je dirais que l'utilisation des directives #pragma n'est pas très sûre, sauf si vous savez vraiment ce que vous faites, ou si vous utilisez par exemple OpenMP pour la parallélisation ...;)
Dee'Kej
1
Les #pragmadirectives @ Dee'Kej sont parfaitement sûres si vous les encapsulez dans #ifdef some_compiler ... #endif. Les avertissements sont une fonctionnalité spécifique au compilateur et ne sont pas définis par la norme. Vous ne pouvez pas supprimer les avertissements du code sans #pragmas.
Kotauskas
@ vladislav-toncharov Vous avez raison sur le fait que les avertissements sont spécifiques au compilateur. Mais nous ne parlons pas ici des avertissements du compilateur en général - nous parlons spécifiquement de GCC. Vous avez également raison de dire que #pragma n'est pas nuisible en soi. Cependant, beaucoup de gens à l'OMI ne savent pas comment utiliser correctement #pragma, et c'est pourquoi je le considère comme «dangereux» (faute de meilleurs mots).
Dee'Kej
15

Voir man gccsous Options d'avertissement. Là, vous avez tout un tas deunused

Options d'avertissement
... -Wunused -Wunused-function -Wunused-label -Wunused-parameter -Wunused-value -Wunused-variable -Wunused-but-set-parameter -Wunused-but-set-variable

Si vous préfixez l'un d'entre eux avec no-, cela désactivera cet avertissement.

De nombreuses options ont des noms longs commençant par -f ou par -W --- par exemple, -fmove-loop-invariants, -Wformat et ainsi de suite. La plupart d'entre eux ont des formes à la fois positives et négatives; la forme négative de -ffoo serait -fno-foo. Ce manuel ne documente qu'un seul de ces deux formulaires, celui qui n'est pas celui par défaut.

Des explications plus détaillées peuvent être trouvées dans Options pour demander ou supprimer les avertissements

Olaf Dietsche
la source
Je ne savais pas que je pouvais préfixer "non-" avec des avertissements.
RNA
10

L'utilisation -Wno-unused-variabledevrait fonctionner.

Mats Petersson
la source
Ahh, variable non utilisée, pas de valeur non utilisée!
WilliamKF
5
Ou -Wno-error=unused-variablesi vous souhaitez supprimer l'erreur et conserver l'avertissement.
Oskar N.
1
Vous pouvez réellement voir quel est l'avertissement réel [-Werror=unused-variable].
Mats Petersson
3

Le compilateur vous le dit déjà, ce n'est pas valuemais variable. Vous recherchez -Wno-unused-variable. Essayez également g++ --help=warningsde voir une liste des options disponibles.

Daniel Frey
la source
3

Comment désactiver les avertissements de variables inutilisées provenant de gcc?
J'obtiens des erreurs de boost sous Windows et je ne veux pas toucher au code boost ...

Vous visitez Trac de Boost et déposez un rapport de bogue contre Boost.

Votre application n'est pas responsable de la suppression des avertissements et des erreurs de la bibliothèque. La bibliothèque est responsable de la suppression de ses propres avertissements et erreurs.

jww
la source
0

-Wallet -Wextraprépare le terrain dans GCC et le suivant -Wno-unused-variablepeut ne pas prendre effet. Par exemple, si vous avez:

CFLAGS += -std=c99 -pedantic -pedantic-errors -Werror -g0 -Os \ -fno-strict-overflow -fno-strict-aliasing \ -Wall -Wextra \ -pthread \ -Wno-unused-label \ -Wno-unused-function \ -Wno-unused-parameter \ -Wno-unused-variable \ $(INC)

alors GCC voit l'instruction -Wall -Wextraet semble ignorer-Wno-unused-variable

Cela peut ressembler à ceci ci-dessous et vous obtenez l'effet souhaité de ne pas être arrêté dans votre compilation sur la variable inutilisée:

CFLAGS += -std=c99 -pedantic -pedantic-errors -Werror -g0 -Os \ -fno-strict-overflow -fno-strict-aliasing \ -pthread \ -Wno-unused-label \ -Wno-unused-function \ $(INC)

Il y a une bonne raison pour laquelle on l'appelle un "avertissement" par rapport à une "erreur". Échouer la compilation simplement parce que votre code n'est pas complet (disons que vous supprimez l'algorithme) peut être un échec.

William Cerniuk
la source
-3
export IGNORE_WARNINGS=1

Il affiche des avertissements, mais continue avec la construction

Sifiso Myeni
la source