web-dev-qa-db-fra.com

Comment désactiver les avertissements de variable inutilisés sortant de gcc dans un code tiers que je ne souhaite pas éditer?

J'aimerais savoir quel commutateur vous passez au compilateur gcc pour désactiver les avertissements de variables inutilisés? 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 à la fois -Wunused-value et -Wno-unused-value, mais je n'ai pas 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 le -Wall remplace mon objectif?

83
WilliamKF

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

Je vous recommanderais de garder l'avertissement, mais utilisez -isystem au lieu de -I pour inclure les répertoires des projets tiers. Ce drapeau indique à GCC de ne pas vous avertir de tout ce sur quoi vous n’avez aucun contrôle.

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

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

214
user405725

Parfois, vous avez juste besoin de ne supprimer que certains avertissements et vous souhaitez conserver d'autres avertissements, juste pour être en sécurité. 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 arriver que vous deviez utiliser cette fonction en tant que gestionnaire, ce qui est assez courant dans la bibliothèque C++ Boost. Ensuite, vous avez besoin du deuxième paramètre formel version , de sorte que la signature de la fonction est identique à celle du modèle requis par le gestionnaire, sinon la compilation échouerait. Mais vous n'en avez pas vraiment besoin dans la fonction elle-même non plus ...

La solution pour marquer une 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 beaucoup d'autres paramètres, vous pouvez les vérifier dans le man pages. Cela fonctionne également pour les programmes C, pas seulement C++, et je pense que cela peut être utilisé dans presque toutes les fonctions, pas seulement les gestionnaires. Allez-y et essayez-le! ;)

P.S .: Dernièrement, j'ai utilisé ceci pour supprimer les avertissements de la sérialisation de Boosts dans un modèle comme ceci:

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 le souhaitiez, drak0sha l'a fait mieux. C'est parce que j'ai principalement suivi le titre de la question, mon mauvais. Espérons que cela pourrait aider d'autres personnes, qui arrivent ici à cause de ce titre ... :)

69
Dee'Kej

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

#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.

65
Ole Wolf

Voir man gcc sous Options d'avertissement. Là vous avez tout un tas de unused

Options d'avertissement
... -Wunused -Wunused-function -Wunused-label -Wunused-paramètre -Wunused-value -Wunused-variable -Wunused-but-set-paramètre -Wunused-but-set-variable

Si vous préfixez l'un d'eux avec _no-_, cet avertissement sera désactivé.

De nombreuses options ont des noms longs commençant par -f ou par -W ---, par exemple, -fmove-loop-invariants, -Wformat, etc. 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 que l’un de ces deux formulaires, quel que soit le formulaire par défaut.

Des explications plus détaillées sont disponibles à l’adresse Options permettant de demander ou de supprimer des avertissements

15
Olaf Dietsche

Utilisez -Wno-unused-variable devrait fonctionner.

9
Mats Petersson

Comment désactiver les avertissements de variable inutilisés sortant de gcc?
Je reçois des erreurs de boost sur Windows et je ne veux pas toucher au code de boost ...

Vous visitez Boost's Trac 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.

3
jww

Le compilateur vous dit déjà que ce n'est pas value mais variable. Vous recherchez -Wno-unused-variable. Aussi, essayez g++ --help=warnings pour voir une liste des options disponibles.

3
Daniel Frey