VS2008 à VS 2010 la migration - un changement de rupture?
-
13-10-2019 - |
Question
a rencontré un problème lors de la migration de notre code C ++ de VS2008 à VS2010. Je ne peux pas trouver une explication à la raison jusqu'à présent et apprécierai votre aide.
Nous avons un allocateur de mémoire personnalisé et il réside dans une dll. Dans le reste du code que nous utilisons le préprocesseur pour rediriger les allocations à nos fonctions. Thie simple code suivant compile correctement dans VS2008, mais ne pas VS2010.
stdafh.h:
#define free my_free
#include <string>
VS2010 que je reçois:
1>d:\program files\microsoft visual studio 10.0\vc\include\xdebug(62): error C3861: 'free': identifier not found
En provenance de la ligne:
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);
Toute aide ou idées sera très appréciée!
Moshe
La solution 2
Après une enquête en utilisant l'option / P pour créer les fichiers de préprocesseur et de les étudier, j'ai trouvé la cause du problème.
L'en-tête xdebug, qui se décrit comme « en-tête de débogage de support de tas pour Microsoft », contient les lignes suivantes:
#pragma push_macro("free")
#undef free
que la défaite évidemment nos tentatives de le redéfinir. Donc, ce n'est pas quelque chose de nouveau au compilateur, juste #undef ordinaire qui arrive à se produire avec les fonctions que nous essayons de redéfinir
Autres conseils
Selon la norme ISO C ++, section 17.4.3.1.1.2:
Une unité de traduction qui comprend un en-tête ne doit pas contenir de macros qui définissent les noms déclarées ou définis dans cet en-tête. Il ne pourra unité de traduction définir des macros pour les noms lexicalement identiques à des mots clés.
Cela signifie que ce n'est pas légal de #define
un nom de fonction bibliothèque pour signifier autre chose. Je suppose que cela vient de se passer au travail dans VS2008, mais lors de la migration à VS2010 les auteurs du compilateur venu avec une implémentation dans laquelle cela ne fonctionne pas correctement.
Si vous voulez redéfinir ce free
fait, je vous suggère de le faire à travers un canal plus classique en liant le code contre votre propre implémentation de la bibliothèque C qui modifie le comportement par défaut.