MSVC-Wall中标准头文件中的数千个警告是什么?

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没关系).

  • 如果你无法使用标准库编译程序而没有得到警告它几乎使选项无用.您将无法在代码中对库警告和警告进行排序.我只对代码中的内容感兴趣,而不是标准库. (39认同)
  • 实际上,VS库不允许使用-Wall,这实在令人沮丧.还有很好的理由说明应该发出所有警告.标准头文件产生这样的警告只是编码很差 - 或者编译器发出无意义的警告(VS有几个). (31认同)
  • @edA:我不知道使用`/ Wall`会引起很多警告是多么"令人沮丧":正如我在答案中所解释的那样,`/ Wall`可以发出许多警告,尽管有时可能有用,却没有用处大多数时候.Visual C++中的`/ Wall`与g ++上的`-Wall`并不一样(实际上,g ++"有`/ Wall`错误",因为它实际上并没有启用_all_警告).在任何情况下,在Visual C++中,所有通常重要且有用的警告都由`/ W4`启用. (7认同)
  • @edA-qamort-ora-y 问题是很多“警告”实际上应该是注释。举个例子,C4820(“警告:我添加了填充。”)或 C4514(“警告:我优化了一个你从未调用过的内联函数。”)。有些知识很有用,但并不是真正可以更改的东西(例如 `std::swprintf()` 的 C4710(“警告:`inline` 函数实际上并未内联。”),[因为它有一个可变参数列表] (https://msdn.microsoft.com/en-us/library/a98sb923.aspx))。 (2认同)

小智 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是一个聪明的产品,但有时简单的东西真的很愚蠢.


Har*_*ord 9

我知道这是游戏的后期,但我相信我有办法使用/ Wall作为你自己的文件,但不必看到来自微软或其他"外部"标题的噪音.这假设您通过stdafx.h使用预编译头.

  1. 对于项目,将警告级别设置为/ Wall(最大警告)
  2. 对于文件stdafx.cpp,将警告级别设置为/ W4(启用了许多警告,但MS头以静默方式传递)
  3. 对于项目,在"禁用特定警告"下,添加4652

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

为每个新项目执行此操作有点乏味,但不如许多单独的#pragma warning()抑制那么糟糕.


Che*_*Alf 6

用于MSVC使用/W4.

  • 那么没有什么可担心的了. (2认同)