VS2012 C ++警告C4005:'__ useHeader':宏重定义

时间:2013-01-16 17:12:49

标签: c++ visual-studio-2012 vc6

在将旧的C ++项目从Visual Studio 6迁移到Visual Studio 2012时,我们在标准Microsoft平台标头内部发现了一组奇怪的警告:

  • 警告C4005:'__ useHeader':宏重新定义
  • 警告C4005:'__ on_failure':宏重新定义

在线搜索只发现其他一些人遇到此错误。在某些情况下,人们试图使用VS2012来编译传统的DirectX代码 - 我没有这样做。在其他情况下,人们试图使用VS2012来定位Windows XP(使用Update 1中的新选项) - 我正在这样做。

DirectX问题得到了回答,警告将始终告诉您,您正在使用过时的(Win8之前版本)版本编译,而您只需要使用它。

Windows XP问题没有得到解答。其他人只是说他们无法重现这个问题。

我复制了它,并找到了原因,我在这里写这篇文章是为了帮助遇到此事的其他人。

11 个答案:

答案 0 :(得分:19)

进入项目属性,找到“预处理器定义”字段。

除了默认和添加的定义常量之外,您还应该看到一个宏:

%(PreprocessorDefinitions)

这个宏显然带来了一些额外的编译器提供的预处理器定义。我不确定哪个版本的Visual Studio引入了这个宏,但它在Visual Studio 6中不存在

在Visual Studio 2012中,此宏 required 将出现在项目的预处理程序定义字段中。在早期版本的Visual Studio中也可能需要它,但我还没有对它们进行测试。

如果缺少此宏,您将看到如上所示的错误消息。

答案 1 :(得分:12)

更新:

首先查看Edmundanswer to this same question - 尝试一下。如果它工作,太棒了!如果不是......请尝试以下方法:

ORIGINAL:

使用此网页“工作区”标签中提到的解决方法:

http://connect.microsoft.com/VisualStudio/feedback/details/789965/resource-editor-warning-rc4005-on-toolset-visual-studio-2012-windows-xp-v110-xp

即,添加:

#define _USING_V110_SDK71_ 1

...直接在.rc文件之前它包含任何包含导致此警告的系统标题的内容。

答案 2 :(得分:11)

在网上任何地方都没有找到解决方案,所以这对我有用。

我正在使用110_xp工具构建项目

我收到这些警告......

c:\program files (x86)\microsoft sdks\windows\v7.1a\include\sal_supp.h(57): warning C4005: '__useHeader' : macro redefinition
          C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\sal.h(2872) : see previous definition of '__useHeader'
c:\program files (x86)\microsoft sdks\windows\v7.1a\include\specstrings_supp.h(77): warning C4005: '__on_failure' : macro redefinition
          C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\sal.h(2882) : see previous definition of '__on_failure'

显然VC 11标头和7.1a sdk标头之间存在不一致。

在我的stdafx.cpp中我这样做了......

#define _USING_V110_SDK71_

#include "stdafx.h"

......构建问题已经消失。

答案 3 :(得分:6)

这是资源编译器警告。解决方案很简单。右键单击解决方案资源管理器中的.rc文件,然后选择“属性”。现在转到资源>一般>预处理器定义,并添加

%(PreprocessorDefinitions)

答案 4 :(得分:4)

对我来说,另一种解决方案有效。

在项目属性配置属性 C / C ++ 常规中,我更改了字段使用此宏添加包含目录 SDK的路径:

$(WindowsSDK_IncludePath)

在此之前,这个字段有我的SDK v7.1的路径,我有相同的警告。

答案 5 :(得分:3)

如果您的cpp文件没有预编译的标头,则在Stdafx.cpp或Stdafx.h中添加#define _USING_V110_SDK71_将无效。

要解决此问题,请执行以下操作。

在解决方案资源管理器中右键单击项目*→属性 C / C ++ 预处理器预处理器定义编辑→添加_USING_V110_SDK71 _

答案 6 :(得分:2)

它仍然更简单。

只需选中&#34;继承自父项目或项目默认值&#34; 配置属性 C / C ++ →< em>预处理器/预处理器定义→编辑

答案 7 :(得分:1)

对于我来说,这发生在Visual Studio 2017(新安装和修复安装)上。显然,Windows 7.1 SDK已在VS2017之前安装,并​​已集成到Visual Studio 2005安装中。

在我的情况下,这两个文件:

  • %LOCALAPPDATA%\Microsoft\MSBuild\v4.0\Microsoft.Cpp.Win32.user.props
  • %LOCALAPPDATA%\Microsoft\MSBuild\v4.0\Microsoft.Cpp.x64.user.props

包含对Windows 7.1 SDK的include目录和库的引用。删除这些引用完成了这项工作。

请记住,Win32和x64的每个C ++项目都分别继承自这些属性表。

答案 8 :(得分:0)

我在一些源自VC ++ 2003并且多年来逐步升级的项目中遇到了这个问题。我发现虽然项目设置在预处理器定义中有%(PreprocessorDefinitions),但是一些.cpp文件没有(最老的)。将它们更改为&#34;继承父项或项目默认值&#34;它摆脱了警告。

答案 9 :(得分:0)

尽管这个答案适用于VS10,但它可能会提供一些关于VC ++目录宏发生了什么的线索: 当这些语句添加到项目的头文件MyApp中时出现警告:

#ifndef NTDDI_WINXPSP3
#define NTDDI_WINXPSP3 0x05010300
#endif 
#ifndef NTDDI_VISTA
#define NTDDI_VISTA 0x06000000
#endif 
#ifndef NTDDI_VISTASP1
#define NTDDI_VISTASP1 0x06000100
#endif 
#ifndef NTDDI_WS08
#define NTDDI_WS08 0x06000100
#endif 

除了XPSP3 def。:

之外,所有警告都会弹出
  

警告RC4005:&#39; NTDDI_VISTASP1&#39; :重新定义C:\ Program Files(x86)\ Microsoft SDKs \ Windows \ v7.0A \ include \ sdkddkver.h ..,MyApp

MyApp是一个WinDebug 32版本,注意到Windows 7.1SDK出现在proj文件的X64部分中:

<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<PlatformToolset>Windows7.1SDK</PlatformToolset>

预处理程序定义的继承值为_VC80_UPGRADE = 0x0600。在恢复到V100之前使用SDK工具集后,SDK库在的包含目录库目录中的 inherited_from 中找到VC ++目录部分,如上所述here 看起来警告是由升级,迁移或工具集更改的组合生成的。

修改:VS2017(MBCS)中的无关问题选择使用

LoadCursorW(nullptr, IDC_ARROW)

而不是WNDCLASSEXW结构中的默认LoadCursorA(...)。一个可能的解决方案是重新定义如下:

 #define IDC_ARROW           MAKEINTRESOURCEW(32512)

此处可以使用#define之前的#undef procedure来抑制警告:

#ifdef IDC_ARROW
#undef IDC_ARROW
#endif
#define IDC_ARROW           MAKEINTRESOURCEW(32512)

答案 10 :(得分:0)

我知道这是一个老问题,但是...“有时它们会回来”:)

在全新OS上安装VS 2012 Express后,仍然遇到相同的警告。经过一番调查后,我决定将我当前的Program Files (x86)\Microsoft Visual Studio 11.0\VC\include文件夹与VS 2012 Update 4中的相同文件夹进行比较。 比较结果如下: enter image description here

sal.h的区别: enter image description here

如此简单地复制__useHeader的支票可修复所有警告。