63 votes

Que se passe-t-il avec les milliers d'avertissements dans les en-têtes standard dans MSVC -Wall?

Certaines personnes semblent vous conseiller d'utiliser -Wall, mais lorsque je l'ai fait sur un petit projet test qui ne comporte qu'un fichier main.cpp avec certains inclus, je reçois 5800 avertissements dans la plupart des en-têtes standard ou des en-têtes de fenêtres.

Est-ce que le comportement prévu? Comment puis-je rendre ma compilation sans avertissement?

En voici quelques-unes pour vous amuser:

 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/
 

41voto

James McNellis Points 193607

Le Visual C++ /Wall permet à tous les avertissements qui sont désactivés par défaut à l' /W4. Comme vous l'avez constaté, il y a une bonne raison pourquoi beaucoup de ces avertissements sont désactivés par défaut (merci, compilateur, pour me dire que vous avez un rembourrage supplémentaire; je l'apprécie vraiment!). Il est probablement préférable d'utiliser /W4 sur Visual C++.

Intel C++, c'est comme cela aussi (je ne sais pas pour les autres compilateurs qui utilisent la GDE frontend). Si vous le réglez à /W5, il crache des tonnes de messages d'information. Mon favori personnel est qu'il vous avertit si la classe de stockage de spécificateur n'est pas au début d'une déclaration (donc, const static int est de pas y aller, mais static const int est très bien).

27voto

woodspiral Points 99

Pour désactiver les avertissements du système d'en-têtes sur lesquelles vous n'avez aucun contrôle il suffit d'utiliser cette construction:

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

ou de façon plus sélective pour des avertissements spécifiques:

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

Cette réponse a été volée à partir d'un autre Dépassement de la Pile de thread: (http://stackoverflow.com/questions/2541984/how-to-suppress-warnings-in-external-headers-in-visual-c).

Je suis entièrement d'accord avec les observations faites par "edA-qa mort-ora-y". Je veux voir tous les avertissements dans mon code, y compris des choses importantes comme C4265 (DTOR pas virtuel). Bien que C4265 est à l'alerte de niveau 3, Microsoft dans leur sagesse ont désactivé par défaut et que vous avez besoin /Mur pour l'obtenir. Voir cette page pour plus d'informations sur les avertissements sont cachés:

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

Pour voir ces et pour supprimer le bruit de l'extérieur, en-têtes, cette page donne de très bons conseils, et je pense que répond pleinement à la question d'origine qui a commencé ce fil:

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

Fondamentalement, il conseille de créer un 'global' fichier inclus avec le #pragmas de supprimer les mises en garde qui ne vous intéressent pas (peut-être C4820 le rembourrage de une), afin de se prémunir contre les en-têtes de la manière décrite ci-dessus, puis le compiler avec /Mur. C'est un morceau de travail, mais en vaut la peine. En vertu de GCC que c'était juste une question de l'aide -isystem. De développement de Microsoft: prenez note! VS est un produit smart, mais c'est vraiment stupide parfois les choses simples.

9voto

Harold Bamford Points 728

Je sais que c'est tard dans le jeu, mais je crois que j'ai un moyen de les utiliser /Mur pour vos propres fichiers mais pas faut voir le bruit de Microsoft ou d'autres "externe" des en-têtes. Cela suppose que vous êtes en utilisant les en-têtes précompilés via stdafx.h.

  1. Pour le projet, définir le niveau d'avertissement de /Mur (maximum de mises en garde)
  2. Pour le fichier stdafx.cpp, définissez le niveau d'avertissement de /W4 (beaucoup de mises en garde activé mais MME les en-têtes de passer sous silence)
  3. Pour le projet, en vertu de Désactiver les Avertissements Spécifiques, ajouter 4652

Les deux premiers semblent évidentes. Mais quand stdafx.h est inclus dans vos propres fichiers, les niveaux d'alerte ne correspondent pas et avertissement C4652 est émis. Qui va à l'encontre de l'ensemble de l'exercice. Mais maintenant que le message est également supprimé.

C'est un peu fastidieux à faire pour chaque nouveau projet, mais pas aussi mauvais que beaucoup de personne #pragma warning() suppressions.

6voto

Pour MSVC, utilisez /W4 .

1voto

Mike Nakis Points 7259

Je sais que cela a été demandé il y a longtemps et qu'une réponse a déjà été acceptée, mais contrairement aux autres réponses, j'ai une solution à vous proposer: modifiez simplement stdafx.h et insérez ce qui suit juste après le #pragma once et avant toute déclaration #include :

#pragma warning (disable: 4820)

#pragma warning (disable: 4668)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X