MSVC-Wall中标准头文件中有几千个警告是怎么回事?

有些人似乎build议你使用-Wall,但是当我在一个只包含main.cpp的小testing项目上做的时候,我得到了5800个警告,其中大部分是标准头文件或windows头文件。

那是有意的行为? 我怎样才能使我的编译警告免费?

这里只是一些阅读乐趣:

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启用了/W4默认禁用的所有警告。 正如你发现的那样,有一个很好的理由,为什么很多这些警告是默认禁用的(谢谢,编译器,告诉我你已经添加了填充;我真的很感激它!)。 在Visual C ++上使用/W4可能是最好的select。

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

要禁用系统头文件中的警告,你只能使用这个构造:

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

或者更具select性地针对特定的警告:

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

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

我完全同意“edA-qa mort-ora-y”的评论。 我想看看我的代码中的所有警告,包括像C4265(DTOR不是虚拟的)重要的东西。 尽pipeC4265处于警告级别3,但微软默认情况下已将其closures,您需要/ Wall才能获得。 有关隐藏哪些警告的更多信息,请参阅此页面:

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

要看到这些,并抑制外部标题的噪音,这个页面给出了很好的build议,我想完全回答了这个线程开始的原始问题:

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

基本上它build议用适当的#pragmas创build一个'global'包含文件来压制你不关心的警告(可能是C4820的填充),为了防止外部头文件以上述方式,那么编译时使用/壁。 这是一件工作,但值得。 在GCC下,这只是一个使用-isystem的问题。 微软开发:注意! VS是一个聪明的产品,但有时候简单的东西真的很愚蠢。

对于MSVC使用/W4

我知道这在游戏中已经晚了,但是我相信我有一种方法可以使用/ Wall作为自己的文件,但不必看到来自Microsoft或其他“外部”头文件的噪音。 这假定你正在通过stdafx.h使用预编译头文件。

  1. 对于该项目,将警告级别设置为/ Wall(最大警告)
  2. 对于文件stdafx.cpp,将警告级别设置为/ W4(许多警告已启用,但MS头默默通过)
  3. 对于该项目,在“禁用特定警告”下,添加4652

前两个似乎很明显。 但是,当stdafx.h包含在您自己的文件中时,警告级别不匹配,并发出警告C4652。 这整个演习都失败了。 但是现在这个消息也被压制了。

对于每个新项目来说这样做是有点乏味的,但并不像许多单独的#pragma warning()抑制那样糟糕。

在MSVC 2010

选项

configuration属性

C / C ++

高级

禁用特定的警告

设置一个值如4820; 4996; 4514; 4710明确地禁用您认为不重要的警告。 在这一点上,你可以无需担心

使用VC6和Microsoft Platform SDK(例如BaseTsd.h)编译各种软件堆栈时,我遇到了同样的问题。

我(我们)想要做的是为我们的代码控制编译器的警告级别 – 我们希望能够用/ W标志来玩。 实际上,正如已经指出的那样,/ W4使所有通常有用的警告(以及一些虚假的…)。

由于问题来自MSFT头文件,我用一个干净的方式修改了微软提供的头文件。 实施没有太多的变化。

如果编译器抱怨警告C4305,在我插入的源文件中:

 #pragma warning( disable : 4305) 

在犯罪线之前,依次是:

 #pragma warning( default : 4305) 

在违规线后。 没有副作用。 微软可能已经这样做了,可能。