【问题标题】:Can I implement .ToString() on C++ structs for debugging purposes?我可以在 C++ 结构上实现 .ToString() 以进行调试吗?
【发布时间】:2014-12-23 04:47:52
【问题描述】:

在 C# 中,如果我定义了一个结构,我也可以重写 ToString()。然后,当我在调试并添加手表或将鼠标悬停在结构实例上时,工具提示将是计算出的 ToString() 而不是结构的类型名称。

我可以在 C++ 和/或 C++/CLI 中以某种方式做到这一点吗?也就是说,我可以将一个方法定义为结构的一部分(或做任何其他事情),这将导致监视值/工具提示显示我选择的字符串吗? Visual Studio for C/C++ 中的默认字符串呈现是所有结构字段值的列表(或尽可能多地塞入小盒子)。

我的类型都是 C 风格的结构。 (它实际上是在我将文件转换为 .cpp 并修复了一些类型问题之前用 C 编写的,因此我可以在 CLI 中运行它。)这是一个示例结构:

struct other_dollars_node
{
    struct other_dollars_node *next_other_dollars;
    override *overrides;    
    long     other_dollars_id;
    tm       effective_date;
    double   amount;
}

我对 C++/CLI 的经验很少——我的大部分经验都是使用原生 C/C++ 和 C#。我正在使用 Visual Studio 2013。

更新:由于几乎所有现有代码都使用原生 C 语法,而且我更喜欢无需重构即可工作的解决方案,因此 CLI 方面可能不太重要。

【问题讨论】:

  • 检查一下,看看它是否能说明问题stackoverflow.com/questions/5171739/tostring-override-in-c
  • 请澄清一下,您的结构是普通的非托管结构(struct foo)还是托管结构(public value struct foopublic value class foo)?也许向我们展示一个更简单的结构?
  • 你试过 NatVis 吗? msdn.microsoft.com/en-us/library/jj620914.aspx我知道这不是你要求的,但它可能是你需要的
  • @157:问题 5171739 的第二个答案看起来非常接近我想要的,除了它不影响工具提示中显示的内容,而且我不能调用 std::string(variableName)在监视窗口中,因为它说“标识符“std::string”是未定义的。所以它只对从代码中实际调用有用,这不是我要找的。​​span>
  • 如果您使用的是 VS 2013,“托管 C++”不再是一个东西(仅在 VS 2005 中)。 C++/CLI 是正确的术语。

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


【解决方案1】:

我认为您想要做的是为您的原生结构提供调试器可视化。我在 MSDN 上做了一些搜索,找到了这个页面:Create custom views of native objects in the debugger

基本上,您需要做的是向C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\Packages\Debugger\Visualizers 添加一个文件,告诉Visual Studio 如何在调试器窗口中显示您的结构。那里有很多例子,上面的链接提供了一些很好的解释,虽然我承认我自己没有尝试过。

【讨论】:

  • 这正是我想要的。
猜你喜欢
  • 2017-10-23
  • 2015-12-29
  • 1970-01-01
  • 2011-03-31
  • 1970-01-01
  • 1970-01-01
  • 2011-02-08
  • 2016-08-08
  • 1970-01-01
相关资源
最近更新 更多