VS2012 С++ предупреждение C4005: '__useHeader': переопределение макросов
При переносе старого проекта на С++ с Visual Studio 6 до Visual Studio 2012 мы столкнулись с нечетным набором предупреждений из стандартных стандартных заголовков платформы Microsoft:
- предупреждение C4005: '__useHeader': переопределение макросов
- предупреждение C4005: '__on_failure': переопределение макросов
В онлайн-поиске было обнаружено еще несколько человек, столкнувшихся с этой ошибкой. В некоторых случаях именно люди пытались использовать VS2012 для компиляции устаревшего кода DirectX, чего я не делаю. В других случаях именно люди пытались использовать VS2012 для установки на Windows XP (используя новую опцию из Update 1) - что я делаю.
На вопрос DirectX был дан ответ, что всегда будет предупреждаться о том, что вы компилируете с устаревшей (pre-Win8) версией DirectX, и вам просто нужно будет с ней жить.
На вопрос Windows XP не ответил. Другие люди просто сказали, что они не могут воспроизвести проблему.
Я воспроизвел его и нашел причину, которую я пишу здесь, чтобы помочь любому, кто сталкивается с этим.
Ответы
Ответ 1
Перейдите в свойства проекта и найдите поле "Определения препроцессора".
В дополнение к константам по умолчанию и добавленным определениям вы должны увидеть макрос:
%(PreprocessorDefinitions)
Этот макрос, очевидно, содержит некоторые дополнительные предпроцессорные определения, предоставленные компилятором. Я не уверен, какая версия Visual Studio представила этот макрос, но его не было в Visual Studio 6.
В Visual Studio 2012 этот макрос должен присутствовать в вашем поле Определения препроцессора проекта. Это также может потребоваться в более ранних версиях Visual Studio, но я не тестировал их.
Если этот макрос отсутствует, вы увидите сообщения об ошибках, как показано выше.
Ответ 2
Не нашли решение для этой публикации в Интернете, так что вот что сработало для меня.
Я создаю проект с инструментами 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"
... проблема сборки исчезла.
Ответ 3
UPDATE:
Посмотрите 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, прежде чем он включит все, что будет включать заголовки системы, которые вызывают это предупреждение.
Ответ 4
Это предупреждение компилятора ресурсов. Решение легко. Щелкните правой кнопкой мыши файл .rc в проводнике решений и выберите "Свойства". Теперь перейдите в раздел Ресурсы > Общие > Определения препроцессора и добавьте
%(PreprocessorDefinitions)
Ответ 5
Добавление #define _USING_V110_SDK71_
в Stdafx.cpp или Stdafx.h не будет работать, если ваши файлы cpp не имеют предварительно скомпилированных заголовков.
Чтобы решить эту проблему, выполните следующие действия.
Щелкните правой кнопкой мыши проект в обозревателе решений * → Свойства → C/С++ → Препроцессор → Определение препроцессора → изменить → Добавить _USING_V110_SDK71 _
Ответ 6
Это еще проще.
Просто установите флажок "Inherit from parent или project defaults" в Configuration Properties → C/С++ → Определения препроцессора/препроцессора → Изменить.
Ответ 7
Для меня работало другое решение.
В свойствах проекта → Свойства конфигурации → C/С++ → Общие, я изменил поле Дополнение Включить путь каталогов к SDK с помощью этого макроса:
$(WindowsSDK_IncludePath)
До этого это поле имело путь к моему SDK v7.1, и у меня были такие же предупреждения.
Ответ 8
У меня была эта проблема в некоторых проектах, которые возникли с VС++ 2003 и постепенно менялись с годами. Я обнаружил, что, хотя параметры проекта были %(PreprocessorDefinitions)
в определениях препроцессора, некоторые из файлов .cpp не были (самые старые). После изменения их на "Наследовать от родительских или проектов по умолчанию" он избавился от предупреждений.
Ответ 9
Хотя этот ответ для VS10, он представляет интерес, так как может дать некоторые подсказки относительно того, что происходит с макросами VС++:
Предупреждение появилось, когда эти утверждения были добавлены в заголовочный файл проекта, 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.
Предупреждение RC4005: "NTDDI_VISTASP1": переопределение C:\Program Files (x86)\Microsoft SDK\Windows\v7.0A\include\sdkddkver.h.., MyApp
MyApp был сборкой WinDebug 32, отметив, что Windows7.1SDK появился в разделе X64 файла proj:
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<PlatformToolset>Windows7.1SDK</PlatformToolset>
Унаследованное значение для определений препроцессора было _VC80_UPGRADE = 0x0600. После использования набора инструментов SDK перед возвратом на V100 библиотеки SDK были найдены как inherited_from из каталогов Include и каталогов библиотек в разделе VС++ Directories, как указано здесь.
Похоже, что предупреждение генерируется в результате сочетания изменений, изменений или изменений набора инструментов.
Ответ 10
Для меня это произошло с Visual Studio 2017 (как с обновленной, так и с исправленной установкой). Очевидно, что SDK Windows 7.1 был установлен до VS2017 и был интегрирован в установку Visual Studio 2005.
В моем случае два файла:
-
%LOCALAPPDATA%\Microsoft\MSBuild\v4.0\Microsoft.Cpp.Win32.user.props
-
%LOCALAPPDATA%\Microsoft\MSBuild\v4.0\Microsoft.Cpp.x64.user.props
содержатся ссылки на каталоги include и библиотеки SDK Windows 7.1. Удаление этих ссылок выполнило эту работу.
Имейте в виду, что каждый отдельный проект на С++ для Win32 и x64 соответственно наследуется от этих листов свойств.