【问题标题】:Debugging data in 'anonymous namespaces' (C++)在“匿名命名空间”(C++)中调试数据
【发布时间】:2010-11-23 00:40:52
【问题描述】:

最近,我从一位客户那里得到了一个故障转储文件。我可以将问题追溯到一个可能包含不正确数据的类,但我只有一个指向该类的空指针,而不是一个真正的指针(空指针来自窗口属性,因此它是一个空指针) . 不幸的是,我想将指针转换到的类位于匿名命名空间中,如下所示:

namespace
   {
   class MyClass
      {
      ...
      };
   }

...
void *ptr = ...
// I know ptr points to an instance of MyClass,
// and at this location I want to cast ptr to (MyClass *) in the debugger.

当我在监视窗口中使用ptr 时,Visual Studio 2005 只显示指针值。 如果我使用(MyClass *)ptr,调试器会告诉我它不能强制转换。

如何将ptr 转换为MyClass 指针?

注意:我最终可以使用一个愚蠢的命名空间(如源文件的名称),然后使用“使用命名空间”,但我希望有更好的解决方案。

【问题讨论】:

  • 顺便说一句,VS 2008 也出现了同样的问题。我建议给 MS 自己发个便条。

标签: c++ namespaces debugging


【解决方案1】:

MSDN 中提到了这一点。在 Watch 窗口中似乎没有一个很好的解决方案(我猜你可以从列表中获取你的类的修饰名称)。

您的“愚蠢命名空间”的想法可以正常工作,您也可以只声明一个具有愚蠢名称的相同类,然后转换为该类型。

【讨论】:

    【解决方案2】:

    不支持在 Visual Studio 调试器的表达式中引用匿名命名空间(至少从 VS 2017 开始),这真的很烦人。

    来自https://docs.microsoft.com/en-us/visualstudio/debugger/expressions-in-the-debugger#c-expressions

    不支持匿名命名空间。如果您有以下代码,则无法将 test 添加到监视窗口:

    namespace mars
    {   
        namespace  
        {  
            int test = 0;   
        }   
    }   
    int main()   
    {   
        // Adding a watch on test does not work.   
        mars::test++;   
        return 0;   
    }
    

    【讨论】:

      猜你喜欢
      • 2019-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多