Eliminar selectivamente el mensaje de advertencia GCC
warnings (4)
Parece que el manual GCC proporciona una manera de hacer esto con un #pragma, en realidad. (Al contrario de lo que dice Aiden Bell en otra respuesta aquí)
http://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html
Por ejemplo, para la advertencia -Wuninitialized, puede hacer ...
#pragma GCC diagnostic ignored "-Wuninitialized"
... para suprimir la advertencia, o ...
#pragma GCC diagnostic warning "-Wuninitialized"
... para tratarlo como una advertencia (no un error) incluso si está construyendo con -Werror.
Esta pieza de código:
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 lanzando el tipo, pero ¿es posible con un indicador del compilador GCC deshacerse de ese tipo de advertencia en particular y seguir usando -Wall
?
Si necesita que el código funcione portátil, entonces debe convertir el argumento en int sin signo , ya que el tipo int puede tener un tamaño diferente al de Int32 en algunas plataformas.
Para responder a su pregunta sobre la desactivación de advertencias específicas en gcc, puede habilitar advertencias específicas en gcc con -Wxxxx y deshabilitarlas con -Wno-xxxx .
De las opciones de advertencia de GCC :
Puede solicitar muchas advertencias específicas con las opciones que comienzan con
-W
, por ejemplo-Wimplicit
para solicitar advertencias en declaraciones implícitas. Cada una de estas opciones de advertencia específicas también tiene una forma negativa que comienza-Wno-
para desactivar las advertencias; por ejemplo,-Wno-implicit
. Este manual lista solo uno de los dos formularios, el que no sea el predeterminado.
Para su caso la advertencia en cuestión es -Wformat
-Wformat
Verifique las llamadas a printf y scanf, etc., para asegurarse de que los argumentos proporcionados tengan los tipos adecuados para la cadena de formato especificada, y que las conversiones especificadas en la cadena de formato tengan sentido. Esto incluye funciones estándar y otras especificadas por atributos de formato (ver Atributos de función), en las familias printf, scanf, strftime y strfmon (una extensión X / Abrir, no en el estándar C) (u otras familias específicas de destino). Las funciones que se verifican sin que se hayan especificado atributos de formato dependen de la versión estándar seleccionada, y dichas verificaciones de funciones sin el atributo especificado se deshabilitan mediante-ffreestanding
o-fno-builtin
.Los formatos se comparan con las características de formato compatibles con GNU libc versión 2.2. Estas incluyen todas las características ISO C90 y C99, así como las características de la Especificación Unix Única y algunas extensiones BSD y GNU. Es posible que otras implementaciones de bibliotecas no admitan todas estas características; GCC no admite advertencias sobre características que van más allá de las limitaciones de una biblioteca en particular. Sin embargo, si se usa
-Wformat
con-Wformat
, se darán advertencias sobre las características de formato que no se encuentran en la versión estándar seleccionada (pero no para los formatos strfmon, ya que no están en ninguna versión del estándar C). Ver Opciones de Control de Dialecto C.
Supongo que estás buscando el
#ifdef WIN32
#pragma warning (disable: #num of the warning)
#endif
Equivalente en GCC ....
Puede buscar opciones como -Wno-conversion -Wno-format-security que hacen 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 GCC de Google :
Actualmente, GCC no proporciona el servicio #pragma que está buscando.
¡No pierdas la esperanza! Hay alternativas viables.
La primera y mejor manera de corregir el código para que ya no emita la advertencia. Por desgracia, has declarado que no puedes hacer esto. :-(
NOTA: ¡Las advertencias se han vuelto tan detalladas como su equipo puede tolerar! [vea abajo]
La siguiente mejor manera de ignorar la advertencia no deseada es postprocesar la salida de GCC a una secuencia de comandos (como una secuencia de comandos Perl) que elimina la advertencia específica y exacta que desea ignorar.
La siguiente forma de ignorar la advertencia no deseada es desactivar la advertencia para esa unidad de traducción. -Wno-foozle-mcgoogle, solo para esa unidad de traducción en particular. Aunque es un martillo grande y poderoso. Y si la advertencia se encuentra en un archivo de encabezado, puede ser generalizada en todo su proyecto, al cual lo dirigiré a la solución de script de postprocesamiento (suponiendo que no pueda corregir el código).
Por lo tanto, actualmente no, no existe una directiva #pragma para deshabilitar advertencias específicas. En lugar de usar -Wall, puede activar tantas advertencias como pueda menos las específicas.
http://www.network-theory.co.uk/docs/gccintro/gccintro_31.html
o arregla el código
Utilicé los siguientes CFLAGS:
-Wall -Wformat=0