2009-05-29 4 views
14

Ce morceau de code:supprimer sélectivement message d'avertissement GCC

Int32 status; 
printf("status : %x", status) 

me donne l'avertissement suivant:

jpegthread.c:157: warning: format '%x' expects type 'unsigned int', but argument 3 has type 'Int32' 

Je sais que je peux me débarrasser par coulée du type, mais est-il possible avec un indicateur de compilateur GCC pour se débarrasser de ce type particulier d'avertissement, et toujours utiliser -Wall?

+0

Ce que vous devriez probablement faire est d'inclure '', puis 'printf (" status:% "PRIx32, status)', et aussi convertir en entier non signé en premier. –

+0

Aussi, si vous le pouvez, essayez d'utiliser les types 'intX_t' standard de' 'si vous écrivez un nouveau code, quiconque lisant. –

Répondre

8

je les CFLAGS suivants:

-Wall -Wformat=0 
+0

N'a jamais vraiment eu l'exigence, mais je peux voir que c'est pratique :) –

3

Je suppose que vous êtes à la recherche de la

#ifdef WIN32 
#pragma warning (disable: #num of the warning) 
#endif 

équivalent dans GCC ....

Vous pouvez rechercher des options telles que -Wno conversion -Wno-format sécurité qui font le travail ici

http://gcc.gnu.org/onlinedocs/gcc-4.0.0/gcc/Warning-Options.html

Mais en termes de la directive #pragma:

Je cite la liste de diffusion GCC de Google:

GCC n'a pas, actuellement, de fournir l'installation #pragma que vous recherchez.

Ne perdez pas espoir! Il existe des alternatives viables à . La première meilleure façon de corriger le code il n'émet plus l'avertissement. Hélas, vous avez déclaré que vous ne pouvez pas faire cela. :-(

REMARQUE: des avertissements se sont comme bavard que votre équipe peut tolérer [voir ci-dessous]

La meilleure façon d'ignorer l'avertissement indésirable est de post-traitement la sortie GCC à un script (comme un script Perl) que les bandes le

spécifique, vous voulez avertissement exact ignorer.

la prochaine façon d'ignorer l'avertissement indésirable est de désactiver l'avertissement pour cette unité de traduction. -Wno-foozle-mcgoogle, juste pour cette unité de traduction particulière. C'est un gros marteau puissant, cependant. Et si l'avertissement est dans un fichier d'en-tête, il peut être omniprésente dans l'ensemble de votre projet - auquel je vous diriger vers la solution de script de post-traitement (en supposant que vous ne sont pas autorisés à partir la fixation du code) .

Donc actuellement non, il n'y a pas de directive #pragma pour désactiver des avertissements spécifiques. Plutôt que d'utiliser -Wall, vous pouvez activer autant d'avertissements que vous le pouvez, sauf certains spécifiques.

http://www.network-theory.co.uk/docs/gccintro/gccintro_31.html

ou corriger le code

+0

Incorrect selon le manuel du GCC: http://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html –

+0

"ou corriger le code" +1 –

42

Si vous avez besoin de ce code pour travailler portable alors vous jette de l'argument unsigned int, car le type int peut avoir une taille différente de Int32 sur certaines plates-formes.

Pour répondre à votre question sur la désactivation des avertissements spécifiques à gcc, vous pouvez activer des avertissements spécifiques à gcc avec -Wxxxx et les désactiver avec -Wno-xxxx.

De l'GCC Warning Options:

Vous pouvez demander plusieurs avertissements spécifiques avec des options commençant -W, par exemple -Wimplicit pour demander des avertissements sur les déclarations implicites. Chacune de ces options d'avertissement spécifiques a également une forme négative commençant -Wno- pour désactiver les avertissements; par exemple, -Wno-implicit. Ce manuel ne répertorie qu'un seul des deux formulaires, celui qui n'est pas celui par défaut.

Pour votre cas, l'avertissement en question est -Wformat

-Wformat
Vérifier les appels à printf et scanf, etc., pour vous assurer que les arguments fournis ont des types appropriés à la chaîne de format spécifié, et que les conversions spécifiées dans la chaîne de format ont un sens. Cela inclut les fonctions standard et d'autres spécifiées par les attributs de format (voir Attributs de fonction) dans les familles printf, scanf, strftime et strfmon (une extension X/Open, pas dans la norme C) (ou d'autres familles spécifiques à la cible). Les fonctions vérifiées sans que les attributs de format aient été spécifiés dépendent de la version standard sélectionnée, et de telles vérifications de fonctions sans l'attribut spécifié sont désactivées par -ffreestanding ou -fno-builtin.

Les formats sont vérifiés par rapport aux fonctionnalités de format supportées par GNU libc version 2.2. Ceux-ci incluent toutes les fonctionnalités ISO C90 et C99, ainsi que les caractéristiques de la spécification Single Unix et certaines extensions BSD et GNU. Les autres implémentations de bibliothèque peuvent ne pas supporter toutes ces fonctionnalités; GCC ne prend pas en charge les avertissements concernant les fonctionnalités qui dépassent les limites d'une bibliothèque particulière. Toutefois, si -pedantic est utilisé avec -Wformat, des avertissements seront donnés sur les fonctions de format qui ne sont pas dans la version standard sélectionnée (mais pas pour les formats strfmon, puisque ceux-ci ne se trouvent dans aucune version de la norme C). Voir Options Contrôle du dialecte C.

+0

Ne répond pas à la question: comment peut-on désactiver un avertissement spécifique normalement inclus dans -Wall sans éteindre -Wall? Ou est-ce impossible? –

+0

@AaronCampbell: '-Wall -Wno-format' désactive les avertissements de format activés par' -Wall'. –

19

Il semble que le manuel GCC fournisse un moyen de le faire avec un #pragma, en fait. (Contrairement à ce que Aiden Bell a dit dans une autre réponse ici)

http://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html

par exemple pour l'avertissement -Wininitialized, vous pouvez faire ...

#pragma GCC diagnostic ignored "-Wuninitialized" 

... pour supprimer l'avertissement, ou ...

#pragma GCC diagnostic warning "-Wuninitialized" 

... de le traiter comme un avertissement (pas une erreur), même si vous construisez avec -Werror.

+2

Probablement au moment de l'écriture, il n'a pas. Je regarde le manuel 4.1.2, et il n'est pas supporté par cela. – mjs

Questions connexes