Подтвердить что ты не робот

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 не ответил. Другие люди просто сказали, что они не могут воспроизвести проблему.

Я воспроизвел его и нашел причину, которую я пишу здесь, чтобы помочь любому, кто сталкивается с этим.

4b9b3361

Ответ 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 соответственно наследуется от этих листов свойств.