首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NATVIS重新解释类型或别名类型

NATVIS重新解释类型或别名类型
EN

Stack Overflow用户
提问于 2020-05-08 19:24:23
回答 2查看 307关注 0票数 3

在natvis中有没有办法将一个类型重新解释为一个已经由natvis定义的类型?或者给它起别名?

例如,我想做这样的“技巧”(在我的上下文中真的很必要,即使这听起来真的很奇怪,这是一个JIT符号生成的问题)

代码语言:javascript
复制
<Type Name="std::vector&lt;*,*&gt;">
<DisplayString>{*(stl1.dll!std::vector&lt;$T0,$T1&gt *)this}</DisplayString>
</Type>

但它不能显示展开项,它只是将字符串显示为值(考虑到'DisplayString‘角色,这似乎是合乎逻辑的)。

我也尝试过SmartPointer技巧,它做得更好,但当涉及基类时,它就不起作用了(它只显示SmartPointer类型,完全忽略继承)

EN

回答 2

Stack Overflow用户

发布于 2020-05-10 01:12:41

因为您没有展示您的类,所以我只能展示我自己的示例代码。

代码语言:javascript
复制
struct A { int x, y; };
struct B { int x, y; };
struct C { int v, w; };

int main()
{
    A a{ 1,2 };
    B b{ 3,4 };
    C c{ 5,6 };
    return 0;
}

以及natvis:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
  <Type Name="A">
    <AlternativeType Name="B"/>
    <AlternativeType Name="C"/>
    <DisplayString>A {x}, {y}</DisplayString>
  </Type>
</AutoVisualizer>

这将显示为

正如您所看到的,AlternativeName做到了这一点,但它是原始类在natvis上所必需的。它要求两个类具有相同的成员/成员名称。

还请注意,当使用natvis时,启用natvis调试是一个好主意。进入菜单工具/选项/调试/“输出窗口”/“常规输出设置”,并将"Natvis诊断消息(仅限C++)“设置为有用的值。

票数 0
EN

Stack Overflow用户

发布于 2020-11-19 22:31:49

我认为您尝试将一种类型表示为另一种类型(透明地)?在您的例子中,您应该使用ExpandedItem。这应该是可行的:

代码语言:javascript
复制
  <Type Name="std::vector&lt;*,*&gt;">
    <Expand>
      <ExpandedItem>
        *(stl1.dll!std::vector&lt;$T0,$T1&gt *)this
      </ExpandedItem>
    </Expand>
  </Type>

但要注意与reinterpret_cast相关的递归和副作用

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61678053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档