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

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

28

Решение

Зайдите в свойства проекта и найдите поле «Определения препроцессора».

В дополнение к стандартным и добавленным константам определения вы должны увидеть макрос:

%(PreprocessorDefinitions)

Этот макрос, по-видимому, вводит некоторые дополнительные определения препроцессора, предоставляемые компилятором. Я не уверен, что версия Visual Studio представила этот макрос, но это там не было в Visual Studio 6.

В Visual Studio 2012 этот макрос требуется присутствовать в поле «Определения препроцессора» вашего проекта. Это также может потребоваться в более ранних версиях Visual Studio, но я не проверял их.

Если этот макрос отсутствует, вы увидите сообщения об ошибках, как показано выше.

19

Другие решения

Нигде не найдено решение этой проблемы, поэтому вот что сработало для меня.

Я строю проект с инструментами 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"

… проблема сборки ушла.

11

ОБНОВИТЬ:

Увидеть Эдмунд«s ответ на этот же вопрос сначала — попробуй. Если это работает, отлично! Если нет … попробуйте следующее:

ОРИГИНАЛ:

Используйте обходной путь, упомянутый на вкладке «Временные решения» этой веб-страницы:

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

11

Это предупреждение компилятора ресурса. Решение простое. Щелкните правой кнопкой мыши файл .rc в обозревателе решений и выберите «Свойства». Теперь перейдите в Ресурсы> Общие> Определения препроцессора и добавьте

%(PreprocessorDefinitions)
6

Для меня другое решение сработало.

В проекте свойстваСвойства конфигурацииC / C ++генеральный, Я сменил поле Дополнение включает каталоги путь к SDK с этим макросом:

$(WindowsSDK_IncludePath)

До этого в этом поле был путь к моему SDK v7.1, и у меня были те же предупреждения.

4

Добавление #define _USING_V110_SDK71_ в Stdafx.cpp или Stdafx.h не будет работать, если ваши файлы cpp не имеют предварительно скомпилированных заголовков.

Чтобы решить эту проблему, работает следующее.

Щелкните правой кнопкой мыши проект в обозревателе решений * → свойстваC / C ++препроцессорОпределение препроцессораредактировать → Добавить _USING_V110_SDK71_

3

Это все еще проще.

Просто установите флажок «Наследовать от родительского или проекта по умолчанию» в Свойства конфигурацииC / C ++Определения препроцессора / препроцессораредактировать.

2

Для меня это произошло с 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 соответственно наследуется от этих таблиц свойств.

1
По вопросам рекламы [email protected]