使用 natvis 解构结构数组

Posted

技术标签:

【中文标题】使用 natvis 解构结构数组【英文标题】:Deconstruct array of structs with natvis 【发布时间】:2016-11-10 09:36:20 【问题描述】:

我正在寻找一种方法,在 Visual Studio 2015 中使用 natvis 在单独的数组中显示结构数组的条目。

显示这个

+-x[0]
  +-a
  +-b
  +-c
+-x[1]
  +-a
  +-b
  +-c
...

作为

a
+-[0]    (= x[0].a)
+-[1]    (= x[1].a)
...
b
+-[0]    (= x[0].b)
+-[1]    (= x[1].b)
...
c
+-[0]    (= x[0].c)
+-[1]    (= x[1].c)

【问题讨论】:

您能否分享一张有关您身边阵列的默认监视窗口的屏幕截图?是不是表示要在同一个关卡中一个一个的显示一个箭头项的值?由于默认情况下所有默认值都共享为一个父项下的子项。 【参考方案1】:

编辑:在评论之后,这是一个可行的解决方案,但它需要对齐您的代理类型,在我的情况下,这只能使用两个值的幂来完成。

#define A(t) __declspec(align(t))

struct C

    int a;
    int b;
    int c;
    int junk;
;

A(16) struct D

    int z;
;

A(16) struct DB 
    int junk;
    int z;
;

A(16) struct DC 
    int junk[2];
    int z;
;

typedef union

    D da;
    DB db;
    DC dc;
 Ui;

typedef union

    C c[50];
    Ui d[50];
 U;

原始(不完整)答案:

每种类型都被单独解析和可视化。因此,在解析每个 x 元素时,无法存储该数据以供以后聚合 a、b 和 c。

但是,您可以更改代码,使重叠(联合)类型与您的数组完全匹配。然后为每种类型编写单独的可视化工具:

__decltypestruct C  int a,b,c; ;
struct D  int a[10], b[10], c[10]; ;
union 
C c[10];
D d;
;

【讨论】:

感谢您的回答,但我认为联合中的数据不会相同。 d.a[3] 将是 c[1].c.

以上是关于使用 natvis 解构结构数组的主要内容,如果未能解决你的问题,请参考以下文章

函数本地结构/类和 natvis 文件

三阶段课程——Day02(ES6简介let和const)(数据类型和数据结构:字符串扩展Symbol数组新增方法对象新增SetMap数组解构对象解构...运算符)

解构表达式

变量的结构赋值

JavaScript ES6 - 解构赋值

JavaScript ES6 - 解构赋值