2008-12-22 8 views
54

J'ai un tas de compilation affirme, comme:Comment puis-je cacher les avertissements "définis mais non utilisés" dans GCC?

CASSERT(isTrue) or CASSERT2(isTrue, prefix_) 

Lors de la compilation avec GCC je reçois beaucoup d'avertissements comme 'prefix_LineNumber' defined but not used. Y at-il un moyen que je peux cacher les avertissements pour les affirmations de temps de compilation? Je n'ai pas eu de chance à chercher dans la documentation du GCC. J'ai pensé que je pourrais avoir la var automatiquement utilisée globalement dans la même macro mais je ne pourrais pas penser à aucun moyen de le faire.

Est-ce que quelqu'un sait d'un moyen de cacher cet avertissement dans GCC?

Répondre

2

Que diriez-vous de -Wunused-label?

+3

Nope mais votre mauvaise réponse m'a conduit à la droite: D –

42

Solution pour GCC ne pas causer des conflits avec d'autres compilateurs

#ifdef __GNUC__ 
#define VARIABLE_IS_NOT_USED __attribute__ ((unused)) 
#else 
#define VARIABLE_IS_NOT_USED 
#endif 

int VARIABLE_IS_NOT_USED your_variable; 
+1

qui est exactement la façon dont il est également fait dans la source gcc pour les arguments de fonction inutilisés. +1 :) –

+2

J'ai trouvé que l'utilisation de ____attribute____ ((____unused____)) fonctionne pour GCC 4.x.x – mtasic85

3

Il est difficile de répondre sans connaître les détails de vos macros assert statiques. Peut-être que vous pourriez changer à une macro différente pour éviter ce problème? Vous pouvez ajouter l'attribut 'unused' à la macro comme cela a été suggéré, ou vous pouvez utiliser une autre forme de CASSERT().

Voici la description de quelques alternatives:

http://www.jaggersoft.com/pubs/CVu11_3.html

http://blog.kowalczyk.info/kb/compile-time-asserts-in-c.html

http://www.pixelbeat.org/programming/gcc/static_assert.html

28

Vous pouvez créer une instruction vide et un résultat de type annuler. Ceci est portable à travers les compilateurs, et gcc ne vous donnera aucun avertissement, même avec -Wall et -Wextra activé. Par exemple:

int var; // var is not used 
(void)var; // null statement, cast to void -- suppresses warning 

Une technique courante consiste à créer une macro pour cela:

#define UNUSED(x) ((void)(x)) 

int var; 
UNUSED(var); 
+1

Curieusement, je reçois toujours des avertissements. Par exemple, lorsque j'appelle system() et que je ne me soucie pas du retour: '(void) system (cmd.c_str());' Je ne comprends pas pourquoi cela devrait générer un avertissement. – BobDoolittle

+0

@BobDoolittle: Euh, c'est intéressant, je n'ai pas vu ce comportement auparavant. Quel compilateur et quelle version de ce compilateur utilisez-vous? –

+0

gcc 4.8.2 sur Ubuntu 14.04. Je suis en train de compiler toute ma source avec le résultat "Wunused", et je cherche un moyen de supprimer explicitement l'avertissement pour les endroits où il est vérifié que le comportement est correct. J'ai toujours utilisé un casting pour (vide) pour cela dans le passé, mais ne travaille pas ici. – BobDoolittle

89

Je viens de voir ce fil tout en cherchant des solutions à ce problème. Je posterai ici pour être complet la solution que je trouve ...

Les drapeaux du compilateur GCC qui contrôle inutilisé warnings comprennent:

-Wunused-function 
-Wunused-label 
-Wunused-parameter 
-Wunused-value 
-Wunused-variable 
-Wunused (=all of the above) 

Chacun d'eux a une forme négative correspondant à « no- » inséré après le W qui éteint l'avertissement (au cas où il a été allumé par -Wall, par exemple). Ainsi, dans votre cas, vous devez utiliser

-Wno-unused-function 

Bien sûr, cela fonctionne pour le code, pas seulement la compilation affirme. Pour un comportement spécifique à la fonction, jetez un oeil à Function attributes.

+0

Peut-il être défini par fichier? – Danijel

25

Ceci est l'un des avertissements les plus anoyaux, bien que je sois conscient qu'il peut être utile (parfois) de vérifier le code mort. Mais j'ai habituellement des fonctions statiques pour le débogage, ou des fonctions qui peuvent être utiles dans le futur, ou qui ne sont utilisées que temporairement, et je veux les garder dans le code.

Heureusement, cet avertissement ne se soucie pas des fonctions en ligne.

inline static foo() 
{ 
} 
+3

en ligne est juste la solution de contournement dont j'avais besoin, merci. –

+0

Travaillez comme une chose charmante ... UPVOTED – NSPratik

+1

Alors pourquoi ne pas envelopper ces fonctions dans les directives du préprocesseur. Par exemple. '#ifdef UNIT_TEST static foo()'? – Mawg

4
#define UNUSED_VAR  __attribute__ ((unused)) 

pour toute variable il suffit d'utiliser la macro ci-dessus avant son type, par exemple:

UNUSED_VAR int a = 2; 
+1

Nous l'avons adopté pour un projet. MAIS, seulement pour les cas où le compilateur se trompe dans ses avertissements. Par exemple, nous avons des variables qui ne sont accessibles que par pointeur, donc le compilateur pense qu'elles sont inutilisées. Il est acceptable de supprimer les avertissements pour de telles variables, mais les variables vraiment inutilisées doivent être supprimées de notre code. – Mawg

Questions connexes