web-dev-qa-db-fra.com

Qu'en est-il des milliers d'avertissements dans les en-têtes standard dans MSVC -Wall?

Certaines personnes semblent vous conseiller d'utiliser -Wall, mais quand je l'ai fait sur un petit projet de test qui a juste un fichier main.cpp avec quelques inclusions, j'obtiens 5800 avertissements la plupart d'entre eux dans des en-têtes standard ou dans des en-têtes Windows.

Est-ce le comportement voulu? Comment puis-je libérer mon avertissement de compilation?

En voici quelques-uns pour vous amuser à lire:

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/
63
user1115652

Visual C++ /Wall active tous les avertissements désactivés par défaut à /W4. Comme vous l'avez découvert, il y a une bonne raison pour laquelle beaucoup de ces avertissements sont désactivés par défaut (merci, compilateur, de m'avoir dit que vous avez ajouté du remplissage; j'apprécie vraiment!). Il vaut probablement mieux utiliser /W4 sur Visual C++.

Intel C++ est comme ça aussi (je ne connais pas d'autres compilateurs qui utilisent le frontend EDG). Si vous le définissez sur /W5, il crache des tonnes de messages d'information. Mon préféré est qu'il vous avertit si le spécificateur de classe de stockage n'est pas au début d'une déclaration (donc, const static int c'est pas la peine, mais static const int c'est bien).

40
James McNellis

Pour désactiver les avertissements des en-têtes du système sur lesquels vous n'avez aucun contrôle, utilisez simplement cette construction:

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

ou plus sélectivement 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 provient d'un autre thread Stack Overflow: ( https://stackoverflow.com/questions/2541984/how-to-suppress-warnings-in-external-headers-in-visual-c ) .

Je suis entièrement d'accord avec les commentaires de "edA-qa mort-ora-y". Je veux voir tous les avertissements dans mon code, y compris des choses importantes comme C4265 (DTOR non virtuel). Bien que C4265 soit au niveau d'avertissement 3, Microsoft dans sa sagesse l'a désactivé par défaut et vous avez besoin de/Wall pour l'obtenir. Consultez cette page pour plus d'informations sur les avertissements masqués:

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

Pour les voir et supprimer le bruit des en-têtes externes, cette page donne d'excellents 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 fichier d'inclusion `` global '' avec les #pragmas appropriés pour supprimer les avertissements qui ne vous intéressent pas (peut-être C4820 celui de remplissage), pour vous protéger contre les en-têtes externes de la manière décrite ci-dessus, puis la compilation avec/Mur. C'est un travail, mais ça vaut le coup. Sous GCC, il s'agirait simplement d'utiliser -isystem. Développement Microsoft: prenez note! VS est un produit intelligent, mais il est parfois stupide avec des trucs simples.

27
woodspiral

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

  1. Pour le projet, définissez le niveau d'avertissement sur/Mur (avertissements maximum)
  2. Pour le fichier stdafx.cpp, définissez le niveau d'avertissement sur/W4 (de nombreux avertissements sont activés mais les en-têtes MS passent en silence)
  3. Pour le projet, sous Désactiver les avertissements spécifiques, ajoutez 4652

Les deux premiers semblent évidents. Mais lorsque stdafx.h est inclus dans vos propres fichiers, les niveaux d'avertissement ne correspondent pas et l'avertissement C4652 est émis. Ce qui bat tout l'exercice. Mais maintenant, ce message est également supprimé.

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

9
Harold Bamford

Pour MSVC, utilisez /W4.

6

dans MSVC 2010

Options

Propriétés de coniguration

C/C++

Avancé

Désactiver les avertissements spécifiques

définissez une valeur comme 4820; 4996; 4514; 471 pour désactiver explicitement les avertissements que vous considérez comme sans importance. À ce stade, vous pouvez - WALL sans souci

2
EvilTeach

J'ai le même problème initial lors de la compilation de différentes piles de logiciels avec VC6 et Microsoft Platform SDK (dans BaseTsd.h par exemple).

Ce que je (nous) voulons faire, c'est contrôler le niveau d'avertissement du compilateur pour notre code - nous voulons pouvoir jouer avec le drapeau/W. En pratique, comme déjà souligné,/W4 permet tous les avertissements généralement utiles (et aussi certains faux ...).

Comme le problème vient des fichiers d'en-tête MSFT, je modifie de manière propre les fichiers d'en-tête fournis par Microsoft. Il n'y a pas tant de changements à mettre en œuvre.

Si le compilateur se conforme à l'avertissement C4305, dans le fichier source, j'insère:

#pragma warning( disable : 4305)

avant la ligne incriminée, suivi de:

#pragma warning( default : 4305)

après la ligne incriminée. Aucun effet secondaire. Microsoft aurait pu le faire de cette façon, probablement.

1
Bruno Bonnefont