问题 在'匿名命名空间'中调试数据(C ++)


最近,我从客户那里得到了一个崩溃转储文件。我可以将问题跟踪到一个可能包含不正确数据的类,但我只有一个指向类的void指针,而不是一个真正的指针(void-pointer来自window-property,因此它是一个void-pointer) 。 不幸的是,我想将指针强制转换为的类是在匿名命名空间中,如下所示:

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.

如果Visual Studio 2005只显示指针值,则在监视窗口中使用“ptr”。 如果我使用“(MyClass *)ptr”,调试器会告诉我它无法转换为它。

如何将ptr转换为MyClass指针?

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


10509
2017-08-26 14:11


起源

顺便说一下,VS 2008也出现了同样的问题。我建议给自己发一张便条。 - gimpf


答案:


这是在提到的 MSDN。在Watch窗口中看起来不是一个很好的解决方案(你可以从我猜的列表中获取你的类的装饰名称)。

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


9
2017-08-26 22:51





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

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

不支持匿名命名空间。如果您有以下代码,则无法添加 测试 到观察窗口:

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

1
2018-03-31 04:13