VS2008到VS 2010的迁移 - 一个突破性的变化?

时间:2011-01-20 09:48:24

标签: c++ visual-studio-2010 visual-c++-2010

我将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 个答案:

答案 0 :(得分:6)

根据C ++ ISO标准,第17.4.3.1.1.2节:

  

包含标头的翻译单元不应包含定义在该标头中声明或定义的名称的任何宏。此类翻译单元也不应为与关键字词汇相同的名称定义宏。

这意味着#define库函数名称的含义是不合法的。我想这恰好在VS2008中工作,但是当迁移到VS2010时,编译器的作者想出了一个不能正常工作的实现。

如果你想重新定义free的作用,我建议通过将代码与你自己的C库实现相关联来通过一个更传统的渠道来改变默认行为。

答案 1 :(得分:2)

经过一些调查后,使用/ P选项创建预处理器文件并研究它们,我找到了问题的根本原因。

xdebug标头,其自身描述为“Microsoft的调试堆支持标头”,包含以下行:

#pragma push_macro("free")
#undef free

显然打败了我们重新定义它的企图。所以这对编译器来说不是什么新东西,只是简单的#undef恰好与我们尝试重新定义的函数一起出现