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

时间:2009-08-26 14:11:22

标签: c++ namespaces debugging

最近,我收到了客户的故障转储文件。我可以将问题跟踪到一个可能包含不正确数据的类,但我只有一个指向该类的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”,但我希望有更好的解决方案。

2 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:2)

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

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

  

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

A,B,C