Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VS2012 C++;警告C4005:&x27__useHeader';:宏观重新定义 在将一个旧C++项目从VisualStudio 6迁移到VisualStudio 2012时,我们从标准微软平台标题中遇到了一组奇怪的警告: 警告C4005:“\uuuUseHeader”:宏重新定义 警告C4005:“\u上的\u失败”:宏重新定义_C++_Visual Studio 2012_Visual C++ 6 - Fatal编程技术网

VS2012 C++;警告C4005:&x27__useHeader';:宏观重新定义 在将一个旧C++项目从VisualStudio 6迁移到VisualStudio 2012时,我们从标准微软平台标题中遇到了一组奇怪的警告: 警告C4005:“\uuuUseHeader”:宏重新定义 警告C4005:“\u上的\u失败”:宏重新定义

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问题没有得到回答。其他人只是说他们无法重现这个问题 我复制了它,并找到了原因,我在这里写这篇文章是为了帮助其他遇到此问题

在线搜索只发现其他几个人遇到了这个错误。在某些情况下,人们试图使用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)