【问题标题】:VS2008 to VS 2010 migration - a breaking change?VS2008 到 VS 2010 迁移 - 一个重大变化?
【发布时间】:2011-01-20 09:48:24
【问题描述】:

在将我们的 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);

任何帮助或想法将不胜感激!

莫舍

【问题讨论】:

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


    【解决方案1】:

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

    包含头文件的翻译单元不应包含定义在该头文件中声明或定义的名称的任何宏。这样的翻译单元也不应为在词法上与关键字相同的名称定义宏。

    这意味着将库函数名称#define 表示其他含义是不合法的。我猜这只是碰巧在 VS2008 中工作,但是当迁移到 VS2010 时,编译器作者提出了一个无法正常工作的实现。

    如果您想重新定义 free 的功能,我建议您通过更传统的渠道来实现,方法是将代码与您自己的 C 库实现相关联,从而更改默认行为。

    【讨论】:

    • 您可以在标准标头中看到这些重新定义一直在发生,因此您猜我们不是问题的根本原因。我在下面描述了我的发现。不管怎样,谢谢你的建议,我们现在可能需要换个方式写它
    【解决方案2】:

    在使用 /P 选项创建预处理器文件并对其进行研究后,我找到了问题的根本原因。

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

    #pragma push_macro("free")
    #undef free
    

    这显然挫败了我们重新定义它的尝试。所以这对编译器来说并不是什么新鲜事,只是简单的 #undef 恰好发生在我们尝试重新定义的函数中

    【讨论】:

    • 所以看起来你不能影响 STL 中的内容。所以把#define放在字符串include之后。
    猜你喜欢
    • 2017-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-04
    • 2021-07-16
    • 1970-01-01
    • 1970-01-01
    • 2018-11-27
    相关资源
    最近更新 更多