web-dev-qa-db-fra.com

Comment masquer les avertissements "définis mais non utilisés" dans GCC?

J'ai un tas d'assertions de temps de compilation, telles que:

CASSERT(isTrue) or CASSERT2(isTrue, prefix_)

Lors de la compilation avec GCC, je reçois de nombreux avertissements comme 'prefix_LineNumber' defined but not used. Existe-t-il un moyen de masquer les avertissements pour les assertions de temps de compilation? Je n'ai pas eu de chance en recherchant la documentation GCC. J'ai pensé que je pourrais avoir le var automatiquement utilisé globalement dans la même macro mais je ne pouvais pas penser à un moyen de le faire.

Quelqu'un connaît-il un moyen de masquer cet avertissement dans GCC?

60
user34537

Je viens de voir ce fil lors de la recherche de solutions à ce problème. Je poste ici pour être complet la solution que j'ai trouvée ...

Les indicateurs du compilateur GCC qui contrôlent les inutilisés avertissements incluent:

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

Chacun de ceux-ci a une forme négative correspondante avec "non-" inséré après le W qui désactive l'avertissement (au cas où il serait activé par -Wall, par exemple). Ainsi, dans votre cas, vous devez utiliser

-Wno-unused-function

Bien sûr, cela fonctionne pour tout le code, pas seulement pour les assertions au moment de la compilation. Pour un comportement spécifique à une fonction, consultez Attributs de fonction .

94
Arnaud

Solution pour GCC ne provoquant pas de 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;
47
user34537

Vous pouvez créer une instruction null et convertir le résultat en null. Ceci est portable entre les compilateurs, et gcc ne vous donnera aucun avertissement, même avec -Wall et -Wextra activée. 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);
32
Adam Rosenfield

C'est l'un des avertissements les plus ennuyeux, bien que je comprenne qu'il peut être utile (parfois) de vérifier le code mort. Mais j'ai généralement 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 conserver dans le code.

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

inline static foo()
{
}
30
mastermemorex
#define UNUSED_VAR     __attribute__ ((unused))

pour n'importe quelle variable, utilisez simplement la macro ci-dessus avant son type, par exemple:

UNUSED_VAR int a = 2;
7
The joker

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

Voici les descriptions 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

3
Nathan Kurz

Que diriez-vous -Wunused-label?

2
Tamas Czinege

Enveloppez ces fonctions par les directives suivantes Tout le code qui sera placé entre Push et pop ne vous avertira pas des fonctions inutilisées. Tout le reste du code (en dehors de Push and pop) ne sera pas affecté.

#pragma GCC diagnostic Push
#pragma GCC diagnostic ignored "-Wunused-function"

... your code

#pragma GCC diagnostic pop
2
Sasha Itin