63 c++ compiler-warnings visual-c++
有些人似乎建议你使用-Wall,但是当我做了一个小测试项目,它只是有一个main.cpp的一些包括,我得到5800个警告他们大多在标准头文件或窗口标题.
这是预期的行为吗?如何使编译警告免费?
这里有一些阅读乐趣:
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/
Run Code Online (Sandbox Code Playgroud)
Jam*_*lis 41
Visual C++ /Wall启用默认情况下禁用的所有警告/W4.正如您所知,有一个很好的理由为什么默认情况下禁用了很多警告(感谢编译器,告诉我你已经添加了填充;我真的很感激它!).它可能最适合/W4在Visual C++上使用.
英特尔C++也是这样(我不知道其他使用EDG前端的编译器).如果你设置它/W5,它会喷出大量的信息性消息.我个人最喜欢的是它会警告你,如果存储类说明符不在声明的开头(所以,const static int不行,但static const int没关系).
小智 27
要禁用无法控制的系统头的警告,请使用以下构造:
#pragma warning(push, 0)
//Some includes with unfixable warnings
#pragma warning(pop)
Run Code Online (Sandbox Code Playgroud)
或者更有选择性地针对特定警告:
#pragma warning( push )
#pragma warning( disable : 4081)
#pragma warning( disable : 4706 )
// system header includes
#pragma warning( pop )
Run Code Online (Sandbox Code Playgroud)
这个答案来自另一个Stack Overflow线程:( /sf/ask/177938911/).
我完全同意"edA-qa mort-ora-y"的评论.我希望在我的代码中看到所有警告,包括重要的东西,如C4265(DTOR非虚拟).虽然C4265处于警告级别3,但微软在他们的智慧中默认将其关闭,你需要/ Wall才能获得它.有关隐藏哪些警告的详细信息,请参阅此页面:
http://msdn.microsoft.com/en-GB/library/23k5d385(v=vs.80).aspx
要查看这些并抑制来自外部标题的噪音,此页面提供了很好的建议,我认为完全回答了启动此主题的原始问题:
http://blogs.msdn.com/b/vcblog/archive/2010/12/14/off-by-default-compiler-warnings-in-visual-c.aspx
基本上,它建议建立一个"全球性"包括与相应的编译指示打压你不关心(也许C4820填充一个),以防止上述的方式外头,然后用编译警告文件/壁.这是一项工作,但值得.在GCC下,这只是一个使用-isystem的问题.微软开发:注意!VS是一个聪明的产品,但有时简单的东西真的很愚蠢.
我知道这是游戏的后期,但我相信我有办法使用/ Wall作为你自己的文件,但不必看到来自微软或其他"外部"标题的噪音.这假设您通过stdafx.h使用预编译头.
前两个看起来很明显.但是当stdafx.h包含在您自己的文件中时,警告级别不匹配并发出警告C4652.这打败了整个演习.但现在这个消息也被压制了.
为每个新项目执行此操作有点乏味,但不如许多单独的#pragma warning()抑制那么糟糕.
| 归档时间: |
|
| 查看次数: |
17182 次 |
| 最近记录: |