¿Qué pasa con las miles de advertencias en los encabezados estándar en MSVC -Wall?

Algunas personas parecen aconsejarte que uses -Wall, pero cuando lo hice en un pequeño proyecto de prueba que solo tiene un main.cpp con algunos includes, recibo 5800 advertencias, la mayoría de ellos en encabezados estándar o en encabezados de Windows.

¿Es ese comportamiento intencional? ¿Cómo hago para que mi advertencia de comstackción sea gratuita?

Aquí hay solo algunos para divertirse leyendo:

1>c:\program files\microsoft visual studio 10.0\vc\include\stdint.h(105): warning C4668: '_INTPTR' is not defined as a preprocessor macro, replacing with '0' for '#if/#elif' 1>c:\program files\microsoft visual studio 10.0\vc\include\wchar.h(109): warning C4820: '_wfinddata64i32_t' : '4' bytes padding added after data member '_wfinddata64i32_t::attrib' 1>c:\program files\microsoft visual studio 10.0\vc\include\wchar.h(114): warning C4820: '_wfinddata64i32_t' : '4' bytes padding added after data member '_wfinddata64i32_t::name' 1>c:\program files\microsoft visual studio 10.0\vc\include\wchar.h(118): warning C4820: '_wfinddata64_t' : '4' bytes padding added after data member '_wfinddata64_t::attrib' 1>c:\program files\microsoft visual studio 10.0\vc\include\wchar.h(488): warning C4820: '_stat32' : '2' bytes padding added after data member '_stat32::st_gid' 1>c:\program files\microsoft visual studio 10.0\vc\include\wchar.h(504): warning C4820: 'stat' : '2' bytes padding added after data member 'stat::st_gid' 1>c:\program files\microsoft visual studio 10.0\vc\include\wchar.h(520): warning C4820: '_stat32i64' : '2' bytes padding added after data member '_stat32i64::st_gid' 1>c:\program files\microsoft visual studio 10.0\vc\include\wchar.h(521): warning C4820: '_stat32i64' : '4' bytes padding added after data member '_stat32i64::st_rdev' 1>c:\program files\microsoft visual studio 10.0\vc\include\wchar.h(525): warning C4820: '_stat32i64' : '4' bytes padding added after data member '_stat32i64::st_ctime' 1>c:\program files\microsoft visual studio 10.0\vc\include\wchar.h(534): warning C4820: '_stat64i32' : '2' bytes padding added after data member '_stat64i32::st_gid' 1>c:\program files\microsoft visual studio 10.0\vc\include\wchar.h(548): warning C4820: '_stat64' : '2' bytes padding added after data member '_stat64::st_gid' 1>c:\program files\microsoft visual studio 10.0\vc\include\wchar.h(549): warning C4820: '_stat64' : '4' bytes padding added after data member '_stat64::st_rdev' 1>c:\program files\microsoft visual studio 10.0\vc\include\crtdbg.h(1078): warning C4986: 'operator new[]': exception specification does not match previous declaration 1> c:\program files\microsoft visual studio 10.0\vc\include\new(79) : see declaration of 'operator new[]' 1>c:\program files\microsoft visual studio 10.0\vc\include\crtdbg.h(1095): warning C4986: 'operator delete[]': exception specification does not match previous declaration 1> c:\program files\microsoft visual studio 10.0\vc\include\new(77) : see declaration of 'operator delete[]' 1>c:\program files\microsoft visual studio 10.0\vc\include\typeinfo(76): warning C4820: 'type_info' : '3' bytes padding added after data member 'type_info::_M_d_name' 1>c:\program files\microsoft sdks\windows\v7.0a\include\basetsd.h(114): warning C4668: '__midl' is not defined as a preprocessor macro, replacing with '0' for '#if/#elif' 1>c:\program files\microsoft sdks\windows\v7.0a\include\winnt.h(8154): warning C4820: '_SECURITY_QUALITY_OF_SERVICE' : '2' bytes padding added after data member '_SECURITY_QUALITY_OF_SERVICE::EffectiveOnly' 1>c:\program files\microsoft sdks\windows\v7.0a\include\winnt.h(8165): warning C4820: '_SE_IMPERSONATION_STATE' : '2' bytes padding added after data member '_SE_IMPERSONATION_STATE::EffectiveOnly' 1>c:\program files\microsoft sdks\windows\v7.0a\include\winnt.h(8334): warning C4820: '_QUOTA_LIMITS' : '4' bytes padding added after data member '_QUOTA_LIMITS::PagefileLimit' 1>c:\program files\microsoft sdks\windows\v7.0a\include\winnt.h(8357): warning C4820: '_QUOTA_LIMITS_EX' : '4' bytes padding added after data member '_QUOTA_LIMITS_EX::PagefileLimit' 1>c:\program files\microsoft sdks\windows\v7.0a\include\winnt.h(8405): warning C4820: '_JOBOBJECT_BASIC_LIMIT_INFORMATION' : '4' bytes padding added after data member '_JOBOBJECT_BASIC_LIMIT_INFORMATION::SchedulingClass' 1>c:\program files\microsoft sdks\windows\v7.0a\include\winnt.h(8984): warning C4820: '_FILE_NOTIFY_INFORMATION' : '2' bytes padding added after data member '_FILE_NOTIFY_INFORMATION::FileName' 1>c:\program files\microsoft sdks\windows\v7.0a\include\winnt.h(9012): warning C4820: '_REPARSE_GUID_DATA_BUFFER' : '3' bytes padding added after data member '_REPARSE_GUID_DATA_BUFFER::GenericReparseBuffer' 1>c:\program files\microsoft sdks\windows\v7.0a\include\winnt.h(10131): warning C4820: '' : '3' bytes padding added after data member '::Data' 1>c:\program files\microsoft sdks\windows\v7.0a\include\winnt.h(10241): warning C4820: '' : '4' bytes padding added after data member '::DecreaseTime' 1>c:\program files\microsoft sdks\windows\v7.0a\include\winnt.h(10262): warning C4820: '' : '4' bytes padding added after data member '::TimerInterval' 1>c:\program files\microsoft sdks\windows\v7.0a\include\wincrypt.h(1440): warning C4668: 'NTDDI_WINLH' is not defined as a preprocessor macro, replacing with '0' for '#if/ 

El Visual C ++ /Wall activa todas las advertencias que están deshabilitadas de forma predeterminada en /W4 . Como descubriste, hay una buena razón por la cual muchas de esas advertencias están deshabilitadas de manera predeterminada (gracias, comstackdor, por decirme que has agregado relleno, ¡realmente lo aprecio!). Probablemente sea mejor usar /W4 en Visual C ++.

Intel C ++ es así también (no sé sobre otros comstackdores que utilizan el frontend EDG). Si lo configura en /W5 , arroja toneladas de mensajes informativos. Mi favorito personal es que te advierte si el especificador de la clase de almacenamiento no está al principio de una statement (por lo tanto, const static int es no go, pero static const int está bien).

Para desactivar las advertencias de los encabezados del sistema sobre los que no tiene control, solo use esta construcción:

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

o más selectivamente para advertencias específicas:

 #pragma warning( push ) #pragma warning( disable : 4081) #pragma warning( disable : 4706 ) // system header includes #pragma warning( pop ) 

Esta respuesta fue robada de otro hilo de Stack Overflow: ( https://stackoverflow.com/questions/2541984/how-to-suppress-warnings-in-external-headers-in-visual-c ).

Estoy totalmente de acuerdo con los comentarios hechos por “edA-qa mort-ora-y”. Quiero ver todas las advertencias en mi código, incluyendo cosas importantes como C4265 (DTOR no virtual). Aunque C4265 está en el nivel de advertencia 3, Microsoft, en su sabiduría, lo ha desconectado de forma predeterminada y necesita / Wall para obtenerlo. Consulte esta página para obtener más información sobre qué advertencias están ocultas:

http://msdn.microsoft.com/en-GB/library/23k5d385(v=vs.80).aspx

Para ver estos y para suprimir el ruido de los encabezados externos, esta página ofrece buenos consejos, y creo que responde completamente a la pregunta original que comenzó este hilo:

http://blogs.msdn.com/b/vcblog/archive/2010/12/14/off-by-default-compiler-warnings-in-visual-c.aspx

Básicamente, aconseja crear un archivo de inclusión ‘global’ con los #pragmas apropiados para suprimir las advertencias que no le interesan (tal vez C4820 el relleno), para protegerse contra los encabezados externos de la manera descrita anteriormente, luego la comstackción con / Pared. Es un trabajo, pero vale la pena. De acuerdo con GCC, solo se trataría de usar -isystem. Desarrollo de Microsoft: ¡tome nota! VS es un producto inteligente, pero a veces es realmente tonto con lo simple.

Sé que esto es tarde en el juego, pero creo que tengo una forma de usar / Wall para tus propios archivos, pero no tengo que ver el ruido de Microsoft u otros encabezados “externos”. Esto supone que está utilizando encabezados precomstackdos a través de stdafx.h.

  1. Para el proyecto, establezca el nivel de advertencia en / Muro (advertencias máximas)
  2. Para el archivo stdafx.cpp, establezca el nivel de advertencia en / W4 (muchas advertencias habilitadas pero las cabeceras MS pasan silenciosamente)
  3. Para el proyecto, en Deshabilitar advertencias específicas, agregue 4652

Los primeros dos parecen obvios. Pero cuando se incluye stdafx.h en sus propios archivos, los niveles de advertencia no coinciden y se emite la advertencia C4652. Lo cual derrota todo el ejercicio. Pero ahora ese mensaje también se suprime.

Es un poco tedioso hacer esto para cada nuevo proyecto, pero no tan malo como muchas supresiones de advertencia de #pragma () individuales.

Para MSVC use /W4 .

en MSVC 2010

Opciones

Propiedades de Coniguración

C / C ++

Avanzado

Deshabilitar advertencias específicas

establezca un valor como 4820; 4996; 4514; 4710 para desactivar explícitamente las advertencias que considere sin importancia. En ese momento, puedes -WALL sin preocupación

Tengo el mismo problema inicial al comstackr varias stacks de software con VC6 y Microsoft Platform SDK (en BaseTsd.h, por ejemplo).

Lo que quiero (hacer) es controlar el nivel de advertencia del comstackdor para nuestro código, queremos poder jugar con el indicador / W. En la práctica, como ya se señaló, / W4 habilita todas las advertencias generalmente útiles (y también algunas falsas …).

Como el problema proviene de los archivos de encabezado de MSFT, modifico de forma limpia los archivos de encabezado suministrados por Microsoft. No hay tantos cambios para implementar.

Si el comstackdor se queja con una advertencia C4305, en el archivo de origen que inserto:

 #pragma warning( disable : 4305) 

antes de la línea ofensiva, seguido de:

 #pragma warning( default : 4305) 

después de la línea ofensiva. Sin efectos secundarios Microsoft podría haberlo hecho de esta manera, probablemente.

Intereting Posts