29

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

  • 警告 C4005:“__useHeader”:宏重新定义
  • 警告 C4005:“__on_failure”:宏重新定义

在线搜索仅发现其他几个人遇到此错误。在某些情况下,有人试图使用 VS2012 来编译旧版 DirectX 代码——我没有这样做。在其他情况下,有人试图使用 VS2012 来针对 Windows XP(使用更新 1 中的新选项)——我正在这样做。

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

没有回答 Windows XP 的问题。其他人只是说他们无法重现该问题。

我复制了它,并找到了原因,我在这里写下它以帮助遇到此问题的其他人。

4

11 回答 11

21

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

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

%(PreprocessorDefinitions)

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

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

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

于 2013-01-16T17:12:49.277 回答
13

更新:

请先查看Edmund对同一问题的回答——试一试。如果它有效,那就太好了!如果没有...尝试以下操作:

原来的:

使用此网页的“解决方法”选项卡中提到的解决方法:

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 文件中,然后它包含任何可能包含导致此警告的系统标头的内容。

于 2013-09-26T17:50:49.543 回答
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"

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

于 2013-05-02T11:29:48.583 回答
6

这是资源编译器警告。解决方案很简单。右键单击解决方案资源管理器中的 .rc 文件,然后选择属性。现在转到 Resources > General > Preprocessor Definitions,然后添加

%(PreprocessorDefinitions)
于 2013-09-12T13:59:08.707 回答
4

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

为了解决这个问题,以下工作。

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

于 2015-06-17T17:29:27.157 回答
4

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

在项目PropertiesConfiguration propertiesC/C++General中,我使用此宏将字段Addition Include Directories path 更改为 SDK:

$(WindowsSDK_IncludePath)

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

于 2016-03-16T11:13:18.893 回答
2

它仍然更简单。

只需选中Configuration PropertiesC/C++Preprocessor / Preprocessor DefinitionsEdit中的“从父级或项目默认值继承”复选框。

于 2014-03-02T09:09:14.700 回答
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++ 项目都分别继承自这些属性表。

于 2017-07-17T18:51:45.767 回答
1

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

于 2016-08-09T14:10:49.617 回答
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)\Microsoft SDKs\Windows\v7.0A\include\sdkddkver.h.., MyApp

MyApp 是 WinDebug 32 版本,注意到 Windows7.1SDK 出现在 proj 文件的 X64 部分:

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

预处理器定义的继承值为 _VC80_UPGRADE=0x0600。在恢复到 V100 之前使用了 SDK 工具集后,SDK 库在VC++ 目录部分的Include 目录Library Directories中被发现为inherit_from ,如此所述。 看起来警告是由于升级、迁移或工具集更改的组合而生成的。

编辑:VS2017(MBCS)中的一个不相关问题选择使用

LoadCursorW(nullptr, IDC_ARROW)

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

 #define IDC_ARROW           MAKEINTRESOURCEW(32512)

在这里,可以通过使用之前的#undef过程#define来抑制警告:

#ifdef IDC_ARROW
#undef IDC_ARROW
#endif
#define IDC_ARROW           MAKEINTRESOURCEW(32512)
于 2016-12-12T13:23:17.530 回答
0

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

在新操作系统上安装 VS 2012 Express 后遇到相同的警告。经过一番调查,我决定将我当前Program Files (x86)\Microsoft Visual Studio 11.0\VC\include的文件夹与 VS 2012 Update 4 的同一文件夹进行比较。这是比较结果: 在此处输入图像描述

sal.h差异: 在此处输入图像描述

如此简单的复制__useHeader检查修复了所有警告。

于 2020-03-03T22:01:02.777 回答