sirve que para language dev define c++ visual-studio-2012 vc6

que - Advertencia VS2012 C++ C4005: ''__useHeader'': redefinición de macros



define max en c (10)

Al migrar un viejo proyecto de C ++ desde Visual Studio 6 hasta Visual Studio 2012, encontramos un extraño conjunto de advertencias dentro de los encabezados estándar de la plataforma de Microsoft:

  • Advertencia C4005: ''__useHeader'': redefinición de macros
  • Advertencia C4005: ''__on_failure'': redefinición de macro

Una búsqueda en línea solo encontró a algunas otras personas que corrían con este error. En algunos casos, fue gente que intentó usar VS2012 para compilar el código de DirectX heredado, lo que no estoy haciendo. En otros casos, fue gente intentando usar VS2012 para apuntar a Windows XP (usando la nueva opción de Actualización 1), lo que estoy haciendo.

La pregunta de DirectX fue respondida que la advertencia siempre estará allí para decirle que está compilando con una versión obsoleta (anterior a Win8) de DirectX, y tendrá que vivir con ella.

La pregunta de Windows XP no fue respondida. Otras personas simplemente dijeron que no podían reproducir el problema.

Lo reproduje y encontré la causa, que estoy escribiendo aquí para ayudar a cualquier otra persona que se encuentre con esto.


Aún es más simple.

Simplemente marque la casilla de verificación "Heredar de los valores predeterminados del proyecto o padre" en Propiedades de configuraciónC / C ++Preprocesador / Definiciones del preprocesadorEditar .


ACTUALIZAR:

Vea primero la respuesta de Edmund a esta misma pregunta , pruébelo. Si funciona, ¡genial! Si no ... intente lo siguiente:

ORIGINAL:

Utilice la solución alternativa mencionada en la pestaña "Soluciones temporales" de esta página web:

connect.microsoft.com/VisualStudio/feedback/details/789965/…

A saber, agregue:

#define _USING_V110_SDK71_ 1

... directamente en el archivo .rc antes de que incluya algo que incluya los encabezados del sistema que causan esta advertencia.


Agregar #define _USING_V110_SDK71_ en Stdafx.cpp o Stdafx.h no funcionaría si sus archivos cpp no ​​tienen encabezados precompilados.

Para resolver este problema, lo siguiente funciona.

Haga clic derecho en el proyecto en el Explorador de soluciones * → PropiedadesC / C ++PreprocesadorDefinición del preprocesadoreditar → Agregar _USING_V110_SDK71_


Aunque esta respuesta es para VS10, es interesante ya que podría proporcionar algunas pistas sobre lo que está sucediendo en las macros de los directorios de VC ++: La advertencia apareció cuando estas declaraciones se agregaron en el archivo de encabezado de un proyecto, 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

Advertencias como las siguientes aparecieron para todos menos la def. XPSP3 .:

Advertencia RC4005: ''NTDDI_VISTASP1'': redefinición C: / Archivos de programa (x86) / Microsoft SDKs / Windows / v7.0A / include / sdkddkver.h .., MyApp

MyApp era una compilación de WinDebug 32, y señaló que Windows7.1SDK apareció en la sección X64 del archivo proj:

<PropertyGroup Condition="''$(Configuration)|$(Platform)''==''Debug|x64''" Label="Configuration"> <PlatformToolset>Windows7.1SDK</PlatformToolset>

El valor heredado para las definiciones de preprocesador era _VC80_UPGRADE = 0x0600. Habiendo utilizado el conjunto de herramientas SDK antes de volver a V100, las bibliotecas SDK se encontraron como inherited_from en Include directories and Library Directories en la sección de directorios de VC ++ , como se indica here .
Parece que la advertencia se genera como resultado de una combinación de actualización, migración o cambios en el conjunto de herramientas.

Editar : un problema no relacionado en VS2017 (MBCS) es optar por usar

LoadCursorW(nullptr, IDC_ARROW)

en lugar de LoadCursorA(...) predeterminado en una estructura WNDCLASSEXW. Una posible solución es redefinir así:

#define IDC_ARROW MAKEINTRESOURCEW(32512)

Aquí la advertencia puede ser suprimida usando el procedimiento #undef antes de #define :

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


Esta es una advertencia del compilador de recursos. La solución es fácil. Haga clic con el botón derecho en el archivo .rc en el explorador de soluciones y elija Propiedades. Ahora vaya a Recursos> General> Definiciones de preprocesador, y agregue

%(PreprocessorDefinitions)


No he encontrado una solución a esta publicación en línea en cualquier lugar, así que esto es lo que funcionó para mí.

Estoy construyendo un proyecto con herramientas 110_xp

Recibo estas advertencias ...

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''

Claramente una incoherencia entre los encabezados VC 11 y los encabezados sdk 7.1a.

En mi stdafx.cpp, hice esto ...

#define _USING_V110_SDK71_ #include "stdafx.h"

... el problema de construcción se ha ido.


Para mí, esto sucedió con Visual Studio 2017 (instalación nueva y reparada). Obviamente, el SDK de Windows 7.1 se había instalado antes de VS2017 y se había integrado en una instalación de Visual Studio 2005.

En mi caso, los dos archivos:

  • %LOCALAPPDATA%/Microsoft/MSBuild/v4.0/Microsoft.Cpp.Win32.user.props
  • %LOCALAPPDATA%/Microsoft/MSBuild/v4.0/Microsoft.Cpp.x64.user.props

contenía referencias a los directorios y bibliotecas de inclusión del SDK de Windows 7.1. Eliminar estas referencias hizo el trabajo.

Tenga en cuenta que cada proyecto de C ++ para Win32 y x64 respectivamente hereda de estas hojas de propiedades.


Para mí, otra solución funcionó.

En las Propiedades del proyecto → Propiedades de configuraciónC / C ++General , modifiqué el campo Incluir ruta de adición de directorios al SDK con esta macro:

$(WindowsSDK_IncludePath)

Antes de eso, este campo tenía la ruta a mi SDK v7.1, y tenía las mismas advertencias.


Tuve este problema en algunos proyectos que se originaron con VC ++ 2003 y que se han actualizado gradualmente a lo largo de los años. Descubrí que, si bien la configuración del proyecto tenía %(PreprocessorDefinitions) en Preprocessor Definitions, algunos de los archivos .cpp no ​​(Los más antiguos). Después de cambiarlos a "Heredar de los valores predeterminados del proyecto o padre" eliminó las advertencias.


Vaya a las propiedades del proyecto y encuentre el campo "Definiciones del preprocesador".

Además de las constantes de definición predeterminadas y agregadas, debería ver una macro:

%(PreprocessorDefinitions)

Aparentemente, esta macro incluye algunas definiciones de preprocesador proporcionadas por el compilador. No estoy seguro de qué versión de Visual Studio presentó esta macro, pero no estaba allí en Visual Studio 6.

En Visual Studio 2012, se requiere que esta macro esté presente en el campo Definiciones de preprocesador de su proyecto. También puede ser necesario en versiones anteriores de Visual Studio, pero no he probado estos.

Si esta macro falta, verá los mensajes de error como se muestra arriba.