2010-07-17 11 views
13

Tengo una biblioteca de terceros que genera un montón de advertencias, incluso en/W3. ¿Hay alguna manera de decirle al compilador "deshabilitar C4244 para cualquier archivo incluido en este directorio o sus subdirectorios"? Por supuesto, no quiero deshabilitar la advertencia en nuestra propia base de código, ni quiero tener que rastrear cada inclusión posible y envolverla con #pragma warning(...¿Puede desactivar advertencias de compilador (específicas) para cualquier encabezado incluido desde una ubicación específica?

+1

Buena pregunta :) Me alegraría si pudiera desactivar las advertencias de los encabezados de Qt. –

+0

@Vitor: estoy seguro de que NO tengo idea de lo que estás hablando. ;) – moswald

+0

No estoy seguro de si un compilador puede hacerlo o no. Pero, en la práctica, puedes filtrar estas advertencias después de compilar. – czchen

Respuesta

9

odio a responder a mi propia pregunta aquí, pero me temo que la respuesta "correcta" en este caso es: es imposible.

+1

Sí. Incluso he tratado de abusar del pre-procesador para generar una macro INCLUDE que deshabilita las advertencias, pero eso no parece posible también. La única salida para tener un resultado sensato, creo, es grep la salida de advertencia del compilador, pero por ahora solo estoy viviendo con todas las advertencias. –

+0

En Visual Studio 2015 (al menos) hay un proyecto 'Propiedades/Todas las opciones/Deshabilitar advertencias específicas' que puede establecer. La CLI para eso es '/ wd4244'. En otros compiladores podría ser '/ nowarn: 4244' en su lugar. –

3

No estoy seguro de si usted quiso decir que no quiere para envolver sus declaraciones de inclusión con las directivas #pragma o no quería perder tiempo rastreando la directiva correcta. Si es el último, entonces esto es lo que hice en el pasado:

#ifdef _MSC_VER 
#pragma warning(disable : 4244) 
#endif 

#include "MyHeader.h" 

#ifdef _MSC_VER 
#pragma warning(default : 4244) /* Reset to default state */ 
#endif 
+0

Lo siento, fue lo primero. Sé cómo desactivar las advertencias a través de #pragma ya. – moswald

+0

Esto debería funcionar. El compilador memoriza el pragma de advertencia que estaba en vigor cuando compiló la declaración. –

+1

@Hans: Esto podría desactivar las advertencias generadas por MyHeader.h, pero no responde mi pregunta. No quiero buscar un par de cientos de archivos para las varias docenas de bibliotecas incluidas, y luego envolverlos con los #pragmas. – moswald

3

Puede intentar eliminar el proyecto de terceros de su ruta de inclusión. A continuación, cree un subdirector que tenga la misma estructura de dir y archivos de encabezado que el proyecto de terceros, de modo que todos los #includes ahora encuentren sus encabezados. Luego, en cada encabezado falso xxxx.h, configura el pragma e incluye el encabezado real xxxx.h, luego borra el pragma. Para evitar recursivamente incluir el mismo archivo, deberá agregar un directorio adicional al #include.

Personalmente, me gustaría ir a través de su proyecto y agregar el del pragma.

5

Usted puede poner banderas, por ejemplo, /wd4600 en VS Project Settings > Command-line Options para decirle al compilador para suprimir específica Complier Warnings

+8

Esto omite la parte sobre la que dice: "No quiero deshabilitar la advertencia en nuestra propia base de código". –

0

Probar:

//in wrapper_3rdParty.h 
#pragma once 

#pragma warning(push) 
#pragma warning(disable : 4244) 

#include "3rdParty.h" 

#pragma warning(pop) 

Luego, en el código, simplemente #include "wrapper_3rdParty.h" lugar.

que maneja los problemas con default comportamiento en la advertencia, y todas las insteances de su uso del paquete htat tienen la advertencia suprimida.

+0

Para responder a todos sus comentarios en un solo lugar: la biblioteca era grande, y tendría que haber escrito docenas de estas. Estaba preguntando sobre un atajo. – moswald

Cuestiones relacionadas