2013-01-16 43 views
25

在迁移从Visual Studio 6的旧的C++项目最多的Visual Studio 2012中,我们遇到了一个奇怪的一系列警告,从标准的微软平台头里面:VS2012 C++警告C4005:“__useHeader”:宏的重新定义

  • 警告C4005: '__useHeader':宏的重新定义
  • 警告C4005: '__on_failure':宏的重新定义

网上搜索才发现遇到了此问题其他几个人。在某些情况下,人们试图使用VS2012编译遗留的DirectX代码 - 我不这么做。在其他情况下,人们试图使用VS2012来定位Windows XP(使用更新1中的新选项) - 我正在这样做。

DirectX问题的回答是,警告将一直存在,告诉您您正在编译DirectX的过期版本(Win8以前版本),并且您只需要忍受它。

Windows XP问题没有回答。其他人只是说他们不能重现问题。

我转载了它,并找到了原因,我正在写这篇文章来帮助任何遇到此问题的人。

回答

17

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

除了默认,并添加定义常量,你会看到一个宏:

%(PreprocessorDefinitions) 

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

是不存在在Visual Studio 2012,该宏需要存在于项目的预处理器定义字段。在早期版本的Visual Studio中也可能需要它,但我没有测试过这些。

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

+7

默认情况下,此宏是在从VS2005迁移到VS2012时添加的,在我的情况下没有帮助。有一次,我将SDK include目录从v7.1A更改为版本为8.0的$(WindowsSDK_IncludePath),所有警告都已发布。 – alex555

+2

我有%(PreprocessorDefinitions),我仍然收到警告。$(WindowsSDK_IncludePath)解决方案为我工作。 –

+2

当单个源文件具有覆盖项目定义的预处理器定义时,也会发生这种情况。 –

9

还没有找到解决方案,这发布在任何地方在线,所以这里是什么对我有用。

我建立了一个项目,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" 

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

+1

在资源编辑器中打开资源时,弹出窗口中出现类似的警告,此提示非常适用于删除它们。 –

+0

我也是,但我不得不使用... #if _USING_V110_SDK71_ == 1/#define _USING_V110_SDK71_ 1/#endif // ...以避免在编译stdafx.cpp时出现相同的警告。当平台工具集设置为v110_xp时,他们似乎会自动在编译器和资源编译器命令行中放置一个/ D“_USING_V110_SDK71_”。很奇怪,这个修复会影响加载Visual Studio资源视图中的资源。但不要误解我的意思,我很高兴它的确如此。谢谢! – DLRdave

+0

我收回......此修复程序对我永久不起作用。我仍然有这样做的错误。我不得不使用这里提到的解决方法:http://connect.microsoft.com/VisualStudio/feedback/details/789965/resource-editor-warning-rc4005-on-toolset-visual-studio-2012-windows-xp-v110 -xp以完全摆脱警告。 – DLRdave

5

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

%(PreprocessorDefinitions) 
+1

C4005错误是编译器错误,但有些人从资源编译器获取_RC_ 4005,在这种情况下,这是他们的解决方案。由于某些原因**个人.rc文件**失去了他们的继承设置。 –

7

UPDATE:

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文件中之前它包括任何可能包含系统头文件这会导致此警告。

+0

希望我前一阵子看到了这个。 – Blazes

+1

不,不要这样做。请参阅Edmund的答案 - 确保各个.rc文件正确地继承项目设置。 –

+0

感谢您的评论 - 我upvoted并链接到埃德蒙的答案。 (虽然我相信它不需要亲自验证就可以工作,但我们后来升级到了VS 2013,并且单个的.rc文件在VS 2013中显示了继承的defs ...) – DLRdave

2

它更简单。

只需选中复选框配置属性C/C++预处理器/预处理定义编辑 “从父或项目默认继承”。

3

在Stdafx.cpp或Stdafx.h中添加#define _USING_V110_SDK71_如果您的cpp文件没有预编译头文件将不起作用。

要解决这个问题,下面的工作。在Solution Explorer

右击项目*→属性C/C++预处理预处理定义编辑→添加_USING_V110_SDK71_

3

对我来说,另一个解决方案工作。

在项目属性配置属性C/C++一般,我改变了场加入包含目录路径与此宏SDK:

$(WindowsSDK_IncludePath) 

在此之前, ,该字段有通向我的SDK v7.1的路径,并且我有相同的警告。

0

我曾经在VC++ 2003的一些项目中遇到过这个问题,并且这些年来一直在进行升级。我发现虽然预处理器定义中的项目设置有%(PreprocessorDefinitions),但一些.cpp文件没有(最老的)。在将它们更改为“从父项目或项目默认值继承”之后,它摆脱了警告。

+0

我实际上最终修改了项目直接删除文件,并删除每个.cpp文件的''元素内的文件特定属性的所有xml元素。 –

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: 'NTDDI_VISTASP1':重新定义C:\ Program Files文件(x86)的\微软的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> 

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

编辑:在VS2017(MBCS),不相关的问题是选择使用

LoadCursorW(nullptr, IDC_ARROW) 

,而不是默认LoadCursorA(...)在WNDCLASSEXW结构。一种可能的解决方案是重新定义像这样:

#define IDC_ARROW   MAKEINTRESOURCEW(32512) 

这里该警告可以通过使用抑制了#undef procedure#define之前:

#ifdef IDC_ARROW 
#undef IDC_ARROW 
#endif 
#define IDC_ARROW   MAKEINTRESOURCEW(32512) 
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的包含目录和库引用。删除这些参考文件完成了这项工作。

请记住,每个用于Win32和x64的C++项目都分别从这些属性页继承而来。