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/
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).
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.
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.
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 ().
Pour MSVC, utilisez /W4
.
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
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.