VS2012 C++;警告C4005:&x27__useHeader';:宏观重新定义 在将一个旧C++项目从VisualStudio 6迁移到VisualStudio 2012时,我们从标准微软平台标题中遇到了一组奇怪的警告: 警告C4005:“\uuuUseHeader”:宏重新定义 警告C4005:“\u上的\u失败”:宏重新定义
在线搜索只发现其他几个人遇到了这个错误。在某些情况下,人们试图使用VS2012编译遗留的DirectX代码,而我没有这样做。在其他情况下,是人们试图使用VS2012以Windows XP为目标(使用更新1中的新选项)——我正在这样做 DirectX问题的答案是,警告将始终存在,告诉您正在使用过时(Win8之前)版本的DirectX进行编译,您将不得不接受它 Windows XP问题没有得到回答。其他人只是说他们无法重现这个问题VS2012 C++;警告C4005:&x27__useHeader';:宏观重新定义 在将一个旧C++项目从VisualStudio 6迁移到VisualStudio 2012时,我们从标准微软平台标题中遇到了一组奇怪的警告: 警告C4005:“\uuuUseHeader”:宏重新定义 警告C4005:“\u上的\u失败”:宏重新定义,c++,visual-studio-2012,visual-c++-6,C++,Visual Studio 2012,Visual C++ 6,在线搜索只发现其他几个人遇到了这个错误。在某些情况下,人们试图使用VS2012编译遗留的DirectX代码,而我没有这样做。在其他情况下,是人们试图使用VS2012以Windows XP为目标(使用更新1中的新选项)——我正在这样做 DirectX问题的答案是,警告将始终存在,告诉您正在使用过时(Win8之前)版本的DirectX进行编译,您将不得不接受它 Windows XP问题没有得到回答。其他人只是说他们无法重现这个问题 我复制了它,并找到了原因,我在这里写这篇文章是为了帮助其他遇到此问题
我复制了它,并找到了原因,我在这里写这篇文章是为了帮助其他遇到此问题的人。进入项目属性,找到“预处理器定义”字段 除了默认和添加的定义常量外,您还应该看到一个宏:
%(PreprocessorDefinitions)
这个宏显然引入了一些额外的编译器提供的预处理器定义。我不确定是哪个版本的VisualStudio引入了这个宏,但VisualStudio6中没有
在Visual Studio 2012中,此宏必须出现在项目的“预处理器定义”字段中。在早期版本的VisualStudio中可能也需要它,但我还没有测试过这些
如果缺少此宏,您将看到如上所示的错误消息。还没有找到解决此问题的方法,因此以下是对我有效的方法 我正在用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"
。。。生成问题已消失。这是一个资源编译器警告。解决办法很简单。在解决方案资源管理器中的.rc文件上单击鼠标右键,然后选择“属性”。现在转到参考资料>常规>预处理器定义,然后添加
%(PreprocessorDefinitions)
更新:
首先,试试看。如果有效,那就太好了!如果不是。。。请尝试以下操作:
原件:
使用此网页“变通办法”选项卡上提到的变通办法:
即增加:
#define _USING_V110_SDK71_ 1
…直接在.rc文件中,然后再包含任何可能包含导致此警告的系统头的内容。更简单
只需选中配置属性中的复选框“从父项或项目默认值继承”→ C/C++→ 预处理器/预处理器定义→ 编辑。如果您的cpp文件没有预编译的标题,则在Stdafx.cpp或Stdafx.h中使用_V110_SDK71添加#定义"将不起作用
要解决此问题,请执行以下操作
右键单击解决方案资源管理器中的项目*→ 性质→ C/C++→ 预处理器→ 预处理器定义→ 编辑→ 使用V110\u SDK71\u为我添加另一个解决方案
在项目属性中→ 配置属性→ C/C++→ 一般情况下,我使用以下宏将字段Addition Include Directories路径更改为SDK:
$(WindowsSDK_IncludePath)
在此之前,此字段有指向我的SDK v7.1的路径,我也有相同的警告。我在一些源于VC++2003的项目中遇到了此问题,并且多年来不断升级。我发现,虽然项目设置在预处理器定义中有%(PreprocessorDefinitions)
,但一些.cpp文件没有(最旧的文件)。将它们更改为“从父级或项目默认值继承”后,它消除了警告。虽然这个答案适用于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:“NTDDI_VISTASP1”:重新定义C:\Program Files(x86)\Microsoft SDK\Windows\v7.0A\include\sdkddkver.h.,MyApp
MyApp是WinDebug 32版本,注意到Windows7.1SDK出现在项目文件的X64部分:
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<PlatformToolset>Windows7.1SDK</PlatformToolset>
而不是WNDCLASSEXW结构中的默认LoadCursorA(…)
。一种可能的解决方案是重新定义如下:
#define IDC_ARROW MAKEINTRESOURCEW(32512)
在这里,可以使用#define
之前的命令来抑制警告:
#ifdef IDC_ARROW
#undef IDC_ARROW
#endif
#define IDC_ARROW MAKEINTRESOURCEW(32512)
对我来说,这发生在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的包含目录和库的引用。删除这些引用完成了任务
<>请记住,Win32和X64的每个C++项目分别继承这些属性表。 < P>我知道这是一个老问题,但是…“有时他们会回来”:
在新操作系统上安装VS 2012 Express后面临相同的警告。经过一些调查,我决定将我当前的程序文件(x86)\Microsoft Visual Studio 11.0\VC\include
文件夹与VS 2012 Update 4中的相同文件夹进行比较。
以下是比较结果:
和sal.h
diff:
因此,简单复制\uuuUseHeader
的检查修复了所有警告。默认情况下,此宏是在从VS2005迁移到VS2012时添加的,对我的情况没有帮助。有一次,我更改了SDK包含控制器
#ifdef IDC_ARROW
#undef IDC_ARROW
#endif
#define IDC_ARROW MAKEINTRESOURCEW(32512)