2009-05-29 19 views
14

Este trozo de código:eliminar selectivamente mensaje de advertencia GCC

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

me da la siguiente advertencia:

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

Sé que puedo deshacerme de él echando el tipo, pero es posible con un indicador de compilador GCC para deshacerse de ese tipo particular de advertencia, y aún así usar -Wall?

+0

Lo que probablemente debería hacer es incluir '' y luego 'printf (" estado:% "PRIx32, estado)', y también convertir primero a entero sin signo. –

+0

Además, si puede, trate de usar los tipos 'intX_t' estándar de' 'si escribe código nuevo, cualquiera que lo lea. –

Respuesta

8

utilicé los siguientes CFLAGS:

-Wall -Wformat=0 
+0

Nunca tuve realmente el requisito, pero puedo ver que es útil :) –

3

supongo que usted está buscando el

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

Equivalente en CCG ....

Puede buscar opciones como -Wno de conversión de formato -Wno seguridad que hacer el trabajo aquí

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

Pero en términos de la directiva #pragma:

Cito de la lista de correo de Google GCC:

GCC no, actualmente, ofrecen la facilidad #pragma que busca.

no pierda la esperanza! Existen alternativas viables .

La primera mejor manera de solucionar el código de modo ya no emite la advertencia. Por desgracia, has declarado que no puedes hacer esto. :-(

NOTA: Haga que las advertencias se presentaron como detallado como su equipo puede tolerar [véase más adelante]

El siguiente mejor manera de pasar por alto la advertencia no deseado es el procesamiento posterior de la salida del GCC a un script (como un script de Perl) que despoja a cabo la específica, exacta advertencia desea ignoran.

la siguiente forma de ignorar la advertencia no deseado es desactivar la advertencia para esa unidad de traducción. -Wno-foozle-mcgoogle, sólo por esa unidad de traducción en particular. Eso es un poderoso martillo grande , sin embargo. Y si la advertencia está en un archivo de cabecera, puede ser penetrante a través de todo su proyecto - a la cual os gustaría dirigir a la solución de script de post-procesamiento (suponiendo que no tienen permitido el fijar el código) .

Por lo tanto, actualmente no, no hay ninguna directiva #pragma para deshabilitar advertencias específicas. En lugar de utilizar -Wall se podría convertir en el mayor número de advertencias que pueda menos los específicos.

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

o corregir el código

+0

Incorrecto según el manual de GCC: http://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html –

+0

"o arregle el código" +1 –

42

Si necesita que el código para trabajar portátil entonces debería el argumento a unsigned int, ya que el tipo int puede tener un tamaño diferente al Int32 en algunas plataformas.

Para responder a su pregunta acerca de cómo deshabilitar advertencias específicas en gcc, se puede habilitar advertencias específicas en gcc con -Wxxxx y desactivarlos con -Wno-xxxx.

Desde el GCC Warning Options:

Puede solicitar muchas advertencias específicas con opciones a partir -W, por ejemplo -Wimplicit para solicitar las advertencias sobre las declaraciones implícitas. Cada una de estas opciones de advertencia específicas también tiene un formulario negativo que comienza en -Wno- para desactivar las advertencias; por ejemplo, -Wno-implicit. Este manual enumera solo uno de los dos formularios, cualquiera que no sea el predeterminado.

Para su caso, la advertencia de que se trate es -Wformat

-Wformat
comprobar las llamadas a printf y scanf, etc., para asegurarse de que los argumentos proporcionados tienen tipos apropiados de la cadena de formato especificado, y que las conversiones especificadas en la cadena de formato tienen sentido. Esto incluye funciones estándar, y otros especificados por los atributos de formato (véase la función atributos), en el printf, scanf, strftime y strfmon (una X/extensión abierto, no en la norma C) familias (o otras familias específicas de la diana). ¿Qué funciones se controlan sin formato de los atributos de haber sido especificada depende de la versión estándar seleccionado, y estos controles de funciones sin el atributo especificado son desactivados por -ffreestanding o -fno-builtin.

Los formatos se comparan las características de formato soportado por GNU libc versión 2.2. Estos incluyen todas las características ISO C90 y C99, así como las características de la especificación Single Unix y algunas extensiones BSD y GNU. Es posible que otras implementaciones de bibliotecas no admitan todas estas características; GCC no admite advertencias sobre funciones que van más allá de las limitaciones de una biblioteca en particular. Sin embargo, si se utiliza con -pedantic-Wformat, se emitirán advertencias sobre el formato no ofrece en la versión estándar seleccionado (pero no para los formatos strfmon, ya los que no se encuentran en ninguna versión de la norma C). Ver opciones Controlling C Dialect.

+0

No responde la pregunta: ¿cómo se puede desactivar una advertencia específica normalmente incluida en -Wall sin apagar -Wall? ¿O es eso imposible? –

+0

@AaronCampbell: '-Wall -Wno-format' desactiva las advertencias de formato activadas por' -Wall'. –

19

Parece que el manual de GCC proporciona una manera de hacer esto con un #pragma, en realidad. (Contrariamente a lo que Aiden Bell, afirma que en otra respuesta aquí)

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

por ejemplo, para la advertencia -Inicializada, puede hacer ...

#pragma GCC diagnostic ignored "-Wuninitialized" 

... suprimir la advertencia, o ...

#pragma GCC diagnostic warning "-Wuninitialized" 

... tratarla como una advertencia (no un error), incluso si usted está construyendo con -Werror.

+2

Probablemente al momento de escribirlo no. Estoy mirando el manual 4.1.2, y no es compatible con eso. – mjs

Cuestiones relacionadas