Миграция с VS2008 на VS 2010 - серьезное изменение? - PullRequest
2 голосов
/ 20 января 2011

Я столкнулся с проблемой при переносе нашего кода C ++ с VS2008 на VS2010. Пока я не могу найти объяснение причины этого и буду признателен за вашу помощь.

У нас есть специальный распределитель памяти, и он находится в DLL. В остальной части кода мы используем препроцессор для перенаправления распределений нашим функциям. Следующий простой код правильно компилируется в VS2008, но не в VS2010.

в stdafh.h:

#define free my_free
#include <string>

В VS2010 я получаю:

1>d:\program files\microsoft visual studio 10.0\vc\include\xdebug(62): error C3861: 'free': identifier not found

Исходя из строки:

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);

Любая помощь или идеи будут высоко оценены!

Моше

Ответы [ 2 ]

6 голосов
/ 20 января 2011

Согласно стандарту C ++ ISO, раздел 17.4.3.1.1.2:

Единица перевода, которая включает заголовок, не должна содержать макросов, которые определяют имена, объявленные или определенные в этом заголовке. Также такая единица перевода не должна определять макросы для имен, лексически идентичных ключевым словам.

Это означает, что #define не разрешено использовать имя библиотечной функции для обозначения чего-то другого. Я полагаю, что это просто сработало в VS2008, но при переходе на VS2010 авторы компилятора придумали реализацию, в которой это не работает должным образом.

Если вы хотите переопределить то, что делает free, я предлагаю сделать это по более обычному каналу, связав код с вашей собственной реализацией библиотеки C, которая изменяет поведение по умолчанию.

2 голосов
/ 23 января 2011

После некоторого исследования с помощью параметра / P для создания файлов препроцессора и их изучения я обнаружил основную причину проблемы.

Заголовок xdebug, который описывает себя как «заголовок поддержки отладочной кучи для Microsoft», содержит следующие строки:

#pragma push_macro("free")
#undef free

, что явно побеждает наши попытки переопределить его. Так что это не что-то новое для компилятора, просто #undef, который происходит с функциями, которые мы пытаемся переопределить

...