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

Jef*_*f B 29 c++ visual-c++-6 visual-studio-2012

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

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

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

DirectX问题得到了解答,警告将始终告诉您,您正在编译DirectX的过时(Win8之前版本)版本,并且您将不得不忍受它.

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

我复制了它,找到了原因,我在这里写这篇文章是为了帮助遇到这个问题的其他人.

Jef*_*f B 20

进入项目属性,找到"预处理器定义"字段.

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

%(PreprocessorDefinitions)
Run Code Online (Sandbox Code Playgroud)

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

在Visual Studio 2012中,此宏必须存在于项目的预处理程序定义字段中.在早期版本的Visual Studio中也可能需要它,但我没有测试过这些.

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

  • 默认情况下,在从VS2005迁移到VS2012时添加此宏,在我的情况下没有帮助.有一次,我将SDK include目录从v7.1A更改为`$(WindowsSDK_IncludePath)`,这是版本8.0的所有警告. (7认同)
  • 我有%(PreprocessorDefinitions),我仍然收到警告.$(WindowsSDK_IncludePath)的解决方案适合我. (2认同)
  • 当单个源文件具有覆盖项目定义的预处理程序定义时,也会发生这种情况. (2认同)

DLR*_*ave 12

更新:

首先看看埃德蒙对这个问题回答 - 尝试一下.如果它工作,太棒了!如果不是......请尝试以下方法:

原版的:

使用此网页"工作区"标签上提到的解决方法:

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
Run Code Online (Sandbox Code Playgroud)

...直接在rc文件之前,它包含任何可能包含系统的头,导致此警告.


小智 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'
Run Code Online (Sandbox Code Playgroud)

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

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

#define _USING_V110_SDK71_

#include "stdafx.h"
Run Code Online (Sandbox Code Playgroud)

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


Edm*_*und 6

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

%(PreprocessorDefinitions)
Run Code Online (Sandbox Code Playgroud)


Dor*_*rin 5

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

\n\n

在项目属性\xe2\x86\x92配置属性\xe2\x86\x92 C/C++ \xe2\x86\x92 General中,我使用以下宏更改了字段Addition Include Directories path to SDK:

\n\n
$(WindowsSDK_IncludePath)\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n