1

在 Visual Studio 2015 观察窗口中,可以通过添加逗号和数组长度来将指针视为数组,例如 d,10 将显示 10 个元素作为 double * d。

是否可以创建一个基于间接次数的 Natvis 类型条目,即。对于 d、d* 和 d** 以不同的方式?通常这些甚至是一种类型的成员,例如 struct s { double* d },但我想避免为所有这些类型编写自定义可视化工具。

这个问题被标记为 VS2015,但如果有的话,欢迎使用 vs2017 或 vs2019 的解决方案。

Edit1: 这是我正在寻找的一个简单示例:

struct S
{
    double* v3;  
    double** m3;
};
int main()
{
    double* pv3 = new double[3]{ -1,-2,-3 };
    double** ppm3 = new double*[3]{ new double[3]{ 1,2,3 }, new double[3]{ 4,5,6 }, new double[3]{ 7,8,9 } };

    S s;
    s.v3 = pv3;
    s.m3 = ppm3;

    double v3[3] = { -1,-2,-3 };
    double m33[3][3] = { { 1,2,3 }, { 4,5,6 }, { 7,8,9 } };
}
  • pv3 和 s.v3 应该像 v3 和
  • ppm3 和 s.m3 应该像 m33 一样可视化

我知道将每个双指针都视为双 [3] 可能不是每个人都想要的,但在某些代码库中,比如我正在研究的代码库,这是 99% 的用例。

丑陋的带注释的 vc 监视窗口快照

4

2 回答 2

1

很抱歉,但看起来您无法轻松实现您想要的目标。

添加<Type Name="double*">或添加<Type Name="double**">到 Natvis Visual Studio 时抱怨

Natvis: NatvisFile.natvis(xx,x): 错误: 不允许原始类型'double**'

因此,无需更改代码,您就需要为所有相关结构添加 natvis。

但是查看您的代码库,我想向您指出CppCoreGuidelines,尤其是这些规则:

如果您的代码库遵循这些规则并且不执行数组到指针的衰减,那么调试器中将提供完整的类型信息。

另一种方法可能是封装double在强类型中。请在 Fluent{C++} 上比较这篇博文。但是,如果您没有需要double*double**.

于 2019-08-06T20:32:24.160 回答
1

As you noticed in your example, you have a structure S, so you can create natvis for this type:

<?xml version="1.0" encoding="utf-8"?>
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
  <Type Name="S">
    <Expand>
      <Item Name="v3">v3, [3]nag</Item>
      <CustomListItems>
        <Variable Name="i" InitialValue="0"/>
        <Loop>
          <Item Name="m3[{i}]">m3[i],[3]nag</Item>
          <Exec>++i</Exec>
          <If Condition="i&gt;=3">
            <Break/>
          </If> 
        </Loop>
      </CustomListItems>
    </Expand>
  </Type>
</AutoVisualizer>

Result for your example: result

But, as @Werner Henze already answered, you can't create natvis for double

于 2019-11-07T08:51:51.693 回答