VS2008 a VS 2010 la migración - un cambio importante?
-
13-10-2019 - |
Pregunta
Me encontró un problema al migrar nuestro código C ++ desde VS2008 a VS2010. No puedo encontrar una explicación por la razón de que hasta el momento y apreciarán su ayuda.
Tenemos un asignador de memoria a medida y que reside en un archivo DLL. En el resto del código se utiliza el preprocesador para redirigir las asignaciones a nuestras funciones. Thie siguiente código simple compila correctamente en VS2008, pero no lo hace en VS2010.
en stdafh.h:
#define free my_free
#include <string>
En VS2010 me sale:
1>d:\program files\microsoft visual studio 10.0\vc\include\xdebug(62): error C3861: 'free': identifier not found
Desde la línea:
template<class _Ty>
void __CLRCALL_OR_CDECL _DebugHeapDelete(_Ty *_Ptr)
{ // delete from the debug CRT heap even if operator delete exists
if (_Ptr != 0)
{ // worth deleting
_Ptr->~_Ty();
// delete as _NORMAL_BLOCK, not _CRT_BLOCK, since we might have
// facets allocated by normal new.
free(_Ptr);
Cualquier ayuda o las ideas será muy apreciada!
Moshe
Solución 2
Después de algunas investigaciones utilizando la opción / P para crear los archivos del preprocesador y el estudio de ellos he encontrado la causa raíz del problema.
La cabecera Xdebug, que se describe como "cabecera apoyo montón de depuración para Microsoft", contiene las siguientes líneas:
#pragma push_macro("free")
#undef free
que obviamente derrotar a nuestros intentos de redefinir la misma. Así que esto no es algo nuevo para el compilador, simplemente #undef claro que pasa a ocurrir con las funciones que tratamos de redefinir
Otros consejos
De acuerdo con el estándar ISO C ++, la sección 17.4.3.1.1.2:
Una unidad de traducción que incluye una cabecera no contendrá ninguna macro que definen nombres declarada o se define en dicha cabecera. Tampoco será una unidad de dicha traducción definir macros para los nombres léxico idénticas a las palabras clave.
Esto significa que no es legal a #define
un nombre de función de biblioteca a significar otra cosa. Supongo que esto acaba de pasar a trabajar en VS2008, pero al migrar a VS2010 los autores del compilador ocurrió una aplicación en la que esto no funciona correctamente.
Si desea volver a definir lo que hace free
, sugiero hacerlo a través de un canal más convencional al vincular el código en contra de su propia implementación de la librería C que cambia el comportamiento predeterminado.