首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >MSVC -Wall标准头中成千上万的警告是怎么回事?

MSVC -Wall标准头中成千上万的警告是怎么回事?
EN

Stack Overflow用户
提问于 2010-10-23 07:55:41
回答 4查看 19.6K关注 0票数 69

有些人似乎建议你使用-Wall,但是当我在一个小的测试项目上这样做时,我得到了5800个警告,其中大多数是在标准标题或windows标题中。

这是故意的行为吗?我如何让我的编译警告免费?

这里只是一些阅读乐趣的例子:

代码语言:javascript
复制
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/
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-10-23 08:02:29

Visual C++ /Wall启用在/W4中默认为禁用的所有警告。正如您已经发现的,有一个很好的理由来解释为什么这些警告在默认情况下是被禁用的(感谢编译器告诉我您已经添加了填充;我真的很感激!)在Visual C++上使用/W4可能是最好的。

英特尔C++也是这样的(我不知道其他使用EDG前端的编译器)。如果你将它设置为/W5,它会喷出大量的信息性消息。我个人最喜欢的是,如果存储类说明符不在声明的开头,它会发出警告(所以,const static int是不可行的,但static const int是可以的)。

票数 46
EN

Stack Overflow用户

发布于 2013-05-19 03:20:30

要禁用来自您无法控制的系统标头的警告,只需使用以下结构:

代码语言:javascript
复制
#pragma warning(push, 0)       
//Some includes with unfixable warnings
#pragma warning(pop)

或者更有选择性地用于特定的警告:

代码语言:javascript
复制
#pragma warning( push )
#pragma warning( disable : 4081)
#pragma warning( disable : 4706 )
// system header includes 
#pragma warning( pop )

这个答案是从另一个堆栈溢出线程中盗取的:(https://stackoverflow.com/questions/2541984/how-to-suppress-warnings-in-external-headers-in-visual-c)。

我完全同意"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

基本上,它建议使用适当的#编译指示创建一个‘全局’包含文件,以抑制您不关心的警告(可能是填充警告),以上述方式防止外部头文件,然后使用/Wall编译。这是一项工作,但值得一试。在GCC的领导下,这只是一个使用-isystem的问题。Microsoft开发:请注意!VS是一个聪明的产品,但它有时真的很愚蠢,使用简单的东西。

票数 27
EN

Stack Overflow用户

发布于 2010-10-23 07:57:59

对于MSVC,请使用/W4

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4001736

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档