2010-03-29 21 views
41

Estoy comenzando un nuevo proyecto BREW, y me gustaría compilar con el Nivel de advertencia 4 (/ W4) para mantener el código de la aplicación limpio y agradable. El problema es que los encabezados BREW no compilan limpiamente con/W4.Cómo suprimir advertencias en encabezados externos en Visual C++

En gcc puede diferenciar entre las aplicaciones y los encabezados del sistema utilizando -I y -isystem, y de forma predeterminada gcc no informa de ninguna advertencia de compilación en los encabezados del sistema. ¿Hay un mecanismo equivalente en Visual C++?

+0

voto para https://visualstudio.uservoice.com/forums/121579-visual-studio-ide/suggestions/14717934-add-a-cl-exe-option-for-system-headers-like-gcc-s – Trass3r

Respuesta

65

Solo use este método alrededor de un bloque de encabezados que no puede cambiar, pero que debe incluir.

se puede evitar selectivamente, y desactivar temporalmente todas las advertencias como esta:

#pragma warning(push, 0)   
//Some includes with unfixable warnings 
#pragma warning(pop) 

En lugar de 0 puede pasar opcionalmente en el número advertencia para desactivar, así que algo como:

#pragma warning(push) 
#pragma warning(disable : 4081) 
#pragma warning(disable : 4706) 
// Some code 
#pragma warning(pop) 
+1

rocas de StackOverflow. Gracias por la respuesta completa. Esta solución es relativamente molesta porque debe hacerse correctamente en cada archivo fuente, mientras que en gcc simplemente configura su archivo MAKE correctamente una vez. –

+2

@Bob: No hay problema, me complace ayudarlo. Podría tratar de incluir esos elementos dentro de un archivo diferente y colocar su advertencia de inclusión desactivada alrededor de ese solo archivo. –

+0

No es particularmente práctico para BREW tampoco, porque no hay un único archivo de encabezado base (o un pequeño grupo de archivos de encabezado) para envolver con un encabezado intermedio. Un proyecto típico tendrá muchos archivos fuente y de encabezado, cada uno de los cuales incluye un subconjunto diferente de los encabezados BREW. Podría hacer un supercabezal que incluya TODOS los encabezados de BREW, y luego precompilarlo para mantener las construcciones eficientes. Esta técnica solo funcionaría para Visual C++, y los proyectos BREW deben compilarse con al menos dos compiladores (Visual C++ para compilaciones de simuladores y gcc o ARM para teléfonos). –

4

Pongo No creo que Visual C++ te permita diferenciar. Usted puede fingir utilizando #pragma warning todo el incluir: equipo

#pragma warning(push, 0) 
#include "mywarningheader.h" 
#pragma warning(pop) 
+1

Diferenciar qué? – einpoklum

+2

@einpoklum Diferenciar entre los encabezados específicos de su aplicación y otros encabezados (de terceros, del sistema, etc.) que no puede cambiar. – Dienes

1

Visual C++ tiene soporte simplemente añadido para los niveles de advertencia en las cabeceras externas. Puede encontrar los detalles en su publicación de blog: Broken Warnings Theory.

En esencia, hace automáticamente lo que las sugerencias aquí se recomiendan hacer manualmente: empuja el nuevo nivel de advertencia justo antes de la directiva #include y aparece enseguida. Hay indicadores adicionales para especificar ubicaciones de encabezados externos, indicador para tratar todos <> incluye como externo, #pragma system_header y una función no disponible en Clang o GCC (a partir de esta redacción) para ver las advertencias en encabezados externos a través de la pila de creación de instancias de plantilla cuando la plantilla fue instanciada en el código de usuario.

Además de los comentarios debajo de esa publicación, también puedes encontrar alguna discusión útil en a reddit announcement for that post.

Cuestiones relacionadas