【问题标题】:VS2012 C++ warning C4005: '__useHeader': macro redefinitionVS2012 C++ 警告 C4005: '__useHeader': 宏重新定义
【发布时间】:2012-12-31 02:20:46
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: c++ visual-studio-2012 visual-c++-6


    【解决方案1】:

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

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

    %(PreprocessorDefinitions)
    

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

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

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

    【讨论】:

    • 这个宏默认是在从 VS2005 迁移到 VS2012 时添加的,对我的情况没有帮助。有一次,我将 SDK 包含目录从 v7.1A 更改为 $(WindowsSDK_IncludePath),即 8.0 版,所有警告都消失了。
    • 我有 %(PreprocessorDefinitions) 但我仍然收到警告。 $(WindowsSDK_IncludePath) 的解决方案对我有用。
    • 当个别源文件具有覆盖项目定义的预处理器定义时,也会发生这种情况。
    • 谢谢!您应该将自己的答案标记为答案。它当然对我有用:D
    • 也为我工作:这个宏已经从我的项目设置中消失了,把它放回去删除了警告。
    【解决方案2】:

    更新:

    首先查看Edmundanswer to this same question -- 试试看。如果它有效,那就太好了!如果没有...尝试以下操作:

    原文:

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

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

    【讨论】:

    • 希望我不久前看到这个。
    • 不,不要这样做。请参阅 Edmund 的回答 - 确保各个 .rc 文件正确继承项目设置。
    • 感谢您的评论——我赞成并链接到 Edmund 的回答。 (不过,我相信它无需亲自验证即可工作。我们已经升级到 VS 2013,并且各个 .rc 文件在 VS 2013 中显示继承的定义很好......)
    • 这是一个有趣的提示。就我而言,我在将 VS2010 项目升级到 VS2018 时遇到了这个问题。将 _USING_V110_SDK71_=1 添加到我的预处理器定义中解决了这个问题。不过,我不确定解决此问题的正确方法。
    【解决方案3】:

    在网上任何地方都没有找到解决此问题的方法,所以这对我有用。

    我正在使用 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"
    

    ...构建问题已经解决。

    【讨论】:

    • 在资源编辑器中打开资源时,我收到了与弹出窗口类似的警告,这个提示非常适合删除它们。
    • 我也是,但我必须使用 ... #if USING_V110_SDK71 == 1 / #define USING_V110_SDK71 1 / #endif // 。 .. 避免在编译 stdafx.cpp 时出现同样的警告。当平台工具集设置为 v110_xp 时,它们似乎会自动在编译器和资源编译器命令行上放置 /D“USING_V110_SDK71”。很奇怪,这个修复会影响在 Visual Studio 的资源视图中加载资源。但不要误会我的意思,我很高兴它确实如此。谢谢!
    • 我收回了.....这个修复对我来说不是永久有效的。这样做我仍然遇到错误。我必须使用此处提到的解决方法:connect.microsoft.com/VisualStudio/feedback/details/789965/… 才能完全消除警告。
    • 我也面临同样的问题。找到解决方案了吗?
    【解决方案4】:

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

    %(PreprocessorDefinitions)
    

    【讨论】:

    • C4005 错误是编译器错误,但有些人从资源编译器得到 RC 4005,在这种情况下,这是他们的解决方案。出于某种原因,单个 .rc 文件丢失了它们的继承设置。
    【解决方案5】:

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

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

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

    【讨论】:

      【解决方案6】:

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

      在项目Properties配置属性C/C++General,我改了字段使用此宏添加包含目录 SDK 路径:

      $(WindowsSDK_IncludePath)
      

      在此之前,此字段包含我的 SDK v7.1 的路径,我也收到了相同的警告。

      【讨论】:

        【解决方案7】:

        还是比较简单的。

        只需在 Configuration PropertiesC/C++Preprocessor / Preprocessor 中选中复选框“从父级或项目默认值继承”定义编辑

        【讨论】:

          【解决方案8】:

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

          【讨论】:

          • 我实际上最终直接修改了项目文件并删除了每个 .cpp 文件的 <ClCompile> 元素中文件特定属性的所有 xml 元素。
          【解决方案9】:

          对我来说,这发生在 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++ 项目都分别继承自这些属性表。

          【讨论】:

            【解决方案10】:

            虽然这个答案是针对 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 工具集,在 Include 目录Library Directories 中发现 SDK 库为 inherited_from VC++ 目录 部分,如 here 所述。
            看起来警告是由于升级、迁移或工具集更改的组合而生成的。

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

            LoadCursorW(nullptr, IDC_ARROW)
            

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

             #define IDC_ARROW           MAKEINTRESOURCEW(32512)
            

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

            #ifdef IDC_ARROW
            #undef IDC_ARROW
            #endif
            #define IDC_ARROW           MAKEINTRESOURCEW(32512)
            

            【讨论】:

              【解决方案11】:

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

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

              sal.h 的区别:

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

              【讨论】:

                猜你喜欢
                • 2016-03-28
                • 1970-01-01
                • 2020-05-27
                • 1970-01-01
                • 2015-01-24
                • 1970-01-01
                • 1970-01-01
                • 2020-04-25
                • 1970-01-01
                相关资源
                最近更新 更多