VS2012 C++ предупреждение C4005: "__useHeader": переопределение макроса
При переносе старого проекта C++ из Visual Studio 6 в Visual Studio 2012 мы обнаружили странный набор предупреждений из стандартных заголовков платформы Microsoft:
- предупреждение C4005: "__useHeader": переопределение макроса
- предупреждение C4005: "__on_failure": переопределение макроса
Поиск в Интернете обнаружил только несколько человек, столкнувшихся с этой ошибкой. В некоторых случаях люди пытались использовать VS2012 для компиляции устаревшего кода DirectX, чего я не делаю. В других случаях это были люди, которые пытались использовать VS2012 для Windows XP (используя новую опцию из Обновления 1), что я и делаю.
На вопрос DirectX был дан ответ, что всегда будет предупреждение о том, что вы компилируете устаревшую (до Win8) версию DirectX, и вам просто придется с этим смириться.
На вопрос Windows XP ответа не было. Другие люди просто сказали, что не могут воспроизвести проблему.
Я воспроизвел это и нашел причину, которую я пишу здесь, чтобы помочь всем, кто сталкивается с этим.
10 ответов
Зайдите в свойства проекта и найдите поле "Определения препроцессора".
Помимо стандартных и добавленных констант определений, вы должны увидеть макрос:
%(PreprocessorDefinitions)
Этот макрос, очевидно, вводит некоторые дополнительные определения препроцессора, предоставляемые компилятором. Я не уверен, какая версия Visual Studio представила этот макрос, но его не было в Visual Studio 6.
В Visual Studio 2012 этот макрос должен присутствовать в поле "Определения препроцессора" вашего проекта. Это также может потребоваться в более ранних версиях Visual Studio, но я не проверял их.
Если этот макрос отсутствует, вы увидите сообщения об ошибках, как показано выше.
ОБНОВИТЬ:
Сначала посмотрите ответ Edmund на этот же вопрос - попробуйте. Если это работает, отлично! Если нет... попробуйте следующее:
ОРИГИНАЛ:
Используйте обходной путь, упомянутый на вкладке "Временные решения" этой веб-страницы:
А именно, добавьте:
#define _USING_V110_SDK71_ 1
... непосредственно в файл.rc, прежде чем он будет содержать все, что будет включать системные заголовки, которые вызывают это предупреждение.
Нигде не найдено решение этой проблемы, поэтому вот что сработало для меня.
Я строю проект с инструментами 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)
Для меня другое решение сработало.
В свойствах проекта → Свойства конфигурации → C / C++ → Общие, я изменил поле Путь к дополнительному каталогу для SDK с помощью этого макроса:
$(WindowsSDK_IncludePath)
До этого в этом поле был путь к моему SDK v7.1, и у меня были те же предупреждения.
Добавление #define _USING_V110_SDK71_
в Stdafx.cpp или Stdafx.h не будет работать, если ваши файлы cpp не имеют предварительно скомпилированных заголовков.
Чтобы решить эту проблему, работает следующее.
Щелкните правой кнопкой мыши проект в обозревателе решений * → Свойства → C / C++ → Препроцессор → Определение препроцессора → Изменить → Добавить _USING_V110_SDK71_
Это все еще проще.
Просто установите флажок "Наследовать от родительского или проекта по умолчанию" в Свойства конфигурации → C / C++ → Определения препроцессора / препроцессора → Редактировать.
Для меня это произошло с 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. Удаление этих ссылок сделало свою работу.
Имейте в виду, что каждый отдельный проект C++ для Win32 и x64 соответственно наследуется от этих таблиц свойств.
У меня была эта проблема в некоторых проектах, которые появились с 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 SDKs \ 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 были найдены как уличенные_ из папки "Включить каталоги и каталоги библиотек" в разделе " Каталоги VC++ ", как указано здесь.
Похоже, что предупреждение генерируется в результате сочетания обновлений, миграции или изменений набора инструментов.
Изменить: несвязанный вопрос в 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)
Я знаю, что это старый вопрос, но... "иногда они возвращаются":)
Столкнулся с такими же предупреждениями после установки VS 2012 Express на свежую ОС. После некоторого расследования я решил сравнить мои текущиеProgram Files (x86)\Microsoft Visual Studio 11.0\VC\include
папка с той же папкой с VS 2012 Update 4. Вот результат сравнения:
Так простое копирование __useHeader
Проверки исправили все предупреждения.