2010-10-22 10 views
52

Algunas personas parecen aconsejarle que use -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.¿Qué pasa con las miles de advertencias en encabezados estándar en MSVC -Wall?

¿Es ese el comportamiento previsto? ¿Cómo hago para que mi advertencia de compilación sea gratuita?

Éstos son sólo algunos para la diversión de la lectura:

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: '<unnamed-tag>' : '3' bytes padding added after data member '<unnamed-tag>::Data' 
1>c:\program files\microsoft sdks\windows\v7.0a\include\winnt.h(10241): warning C4820: '<unnamed-tag>' : '4' bytes padding added after data member '<unnamed-tag>::DecreaseTime' 
1>c:\program files\microsoft sdks\windows\v7.0a\include\winnt.h(10262): warning C4820: '<unnamed-tag>' : '4' bytes padding added after data member '<unnamed-tag>::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/ 
+0

Hay un motivo por el que esas advertencias están deshabilitadas de manera predeterminada. No utilizar -Wall –

+0

GCC tiene una forma de suprimir las advertencias de los encabezados del sistema y la biblioteca ('-isystem' en lugar de' -I' y '#pragma GCC system_header'). ¿No ocurre lo mismo con VC o '/ Wall' desactiva incluso eso? – greyfade

+0

posible duplicado de [MSVC - detener advertencias en encabezados] (http://stackoverflow.com/questions/4292352/msvc-stop-warnings-in-headers) –

Respuesta

33

El Visual C++ /Wall permite a todas las advertencias que están desactivados por defecto en /W4. Como descubriste, hay una buena razón por la cual muchas de esas advertencias están deshabilitadas de manera predeterminada (gracias, compilador, 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 compiladores 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 comienzo de una declaración (por lo tanto, const static int no se va, pero static const int está bien).

+25

Esto es bastante deprimente que las bibliotecas VS no permitan el uso de -Wall. También hay muy buenas razones por las cuales todas las advertencias deben ser emitidas. Es simplemente una mala codificación que los encabezados estándar produzcan tales advertencias, o el compilador emite advertencias sin sentido (que VS tiene varias). –

+7

@edA: No sé qué es tan "deprimente" que el uso de '/ Wall' cause muchas advertencias: como expliqué en la respuesta,'/Wall' permite muchas advertencias que, aunque son potencialmente útiles a veces, no son útil la mayor parte del tiempo. '/ Wall' en Visual C++ no significa lo mismo que' -Wall' en g ++ (realmente, g ++ "tiene'/Wall' wrong, "ya que en realidad no activa _all_ advertencias). En cualquier caso, en Visual C++, todas las advertencias útiles y comunes son habilitadas por '/ W4'. –

+35

Si no puede compilar un programa utilizando la biblioteca estándar y no recibe advertencias, prácticamente inutiliza la opción. No podrá ordenar las advertencias y advertencias de la biblioteca en su código. Solo me interesan las cosas de mi código, no la biblioteca estándar. –

6

Para usar MSVC /W4.

+0

/W4 está alertando – nus

+2

Bueno, no hay nada de qué preocuparse sobre eso – Dialecticus

21

Para desactivar avisos de los encabezados del sistema sobre el cual usted no tiene control sólo tiene que utilizar esta construcción:

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

o más selectiva para las advertencias específicas:

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

esta pregunta hurtó de otro desbordamiento de pila hilo: (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 acerca de los cuales se ocultan las advertencias:

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

Para ver estos y para suprimir el ruido de las cabeceras externas, esta página da consejos, y creo que responde plenamente a la pregunta original que comenzó en este tema:

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

Básicamente se aconseja crear un 'global' archivo de inclusión con las #pragmas adecuadas para eliminar las advertencias que no les importa (tal vez C4820 el relleno uno), para protegerse contra externa encabezados en la forma des citado arriba, luego la compilación con/Wall. 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.

+0

No tiene que usar '/ Wall'. Puede habilitar ese específico con '/ w34265'. Por otro lado, puede usar '/ Wall' y luego desactivar las específicas como la advertencia de relleno con'/wd4820'. Sin embargo, estoy de acuerdo en que '-isystem' sería una característica útil. – cremno

1

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

Lo que quiero (hacer) es controlar el nivel de advertencia del compilador 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 compilador se queja con la advertencia C4305, en el archivo de origen que inserte:

#pragma warning(disable : 4305) 

antes de la línea en cuestión, seguido por:

#pragma warning(default : 4305) 

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

2

en MSVC 2010

Opciones

Propiedades Coniguration

C/C++

avanzada

desactivar avisos específicos

establecer un valor como 4820; 4996; 4514; 4710 para desactivar explícitamente las advertencias que considere importante. En ese momento usted puede -Wall sin preocuparse

+0

Para ser justos, C4514 puede ser bastante útil a veces, simplemente no es la mayoría del tiempo. "C4514:' std :: bad_alloc :: bad_alloc' optimized out "(parafraseado) es bueno saber, por ejemplo (garantiza que no se lanzarán excepciones' bad_alloc'), pero algo como "C4514: 'std :: _ Maklocbyte' Optimized out "o" C4514: 'std :: to_wstring' optimized out "(parafraseado) generalmente lo sería menos. –

6

sé que este es el final del partido, pero creo que tengo una manera de utilizar/Wall en sus propios archivos pero no tiene que ver el ruido de Microsoft u otros encabezados "externos". Esto supone que está utilizando encabezados precompilados a través de stdafx.h.

  1. Para el proyecto, establezca el nivel de alerta a/Wall (advertencias máximo)
  2. Para el stdafx.cpp archivo, establezca el nivel de alerta a/W4 (un montón de advertencias activada pero cabeceras MS pasan en silencio)
  3. Para el proyecto, bajo desactivar avisos específicos, agregue 4652

los dos primeros parecen evidentes. 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().

Cuestiones relacionadas