Visual Studio Natvis DisplayString 条件
Visual Studio Natvis DisplayString Conditionals
使用 Visual Studio 2017,我正在为一些 类 编写可视化工具,但我 运行 遇到了与 .natvis 代码可读性有关的问题。我有一个自定义数组类型,我想在 Watch window 的 Value 字段 [=28] 中显示其成员=]直接(而不是必须使用展开按钮)。
arrayType 是定义数组类型(稀疏、空、密集、单例)的枚举。 numElems 是数组中的条目数。无需关注这个数据结构;这只是一个例子。这是我当前的 natvis 代码:
<Type Name="MyProject::MyArray"
<DisplayString Condition="numElems == 0">
{arrayType, en}
</DisplayString>
<DisplayString Condition="numElems == 1">
{arrayType, en} {*elems[0]}
</DisplayString>
<DisplayString Condition="numElems == 2">
{arrayType, en} {*elems[0]}, {*elems[1]}
</DisplayString>
<DisplayString Condition="numElems == 3">
{arrayType, en} {*elems[0]}, {*elems[1]}, {*elems[2]}
</DisplayString>
<DisplayString Condition="numElems >= 4">
{arrayType, en} {*elems[0]}, {*elems[1]}, {*elems[2]}, ...
</DisplayString>
</Type>
[请注意,我必须再次重复相同的代码(只是添加一个额外的元素来显示)。由于代码膨胀,我停止显示 3 个元素。]
这将允许 Watch Window(在 Visual Studio 内)以下列方式显示对象:
Name Value
arr1 Sparse 5, 3 ; numElems is 2
arr2 Empty ; numElems is 0
arr3 Singleton 1 ; numElems is 1
arr4 Dense 58, 23, 1, ... ; numElems is >= 4
理想情况下,DisplayString 标记允许其中包含条件。我尝试了以下使用 C++ 三元运算符的变通方法,但没有用。
<Type Name="MyProject::Array"
<DisplayString>
{arrayType, en} {(numElems >= 1) ? *elems[0] : ""}, {(numElems >= 2) ? *elems[1] : ""}, {(numElems >= 3) ? *elems[2] : ""}, {(numElems >= 4) ? "..." : ""}
</DisplayString>
</Type>
请注意,在此代码中,我不必多次重复 DisplayString 标记和重复代码。也许有一种方法可以在 DisplayString 中提供迭代器,以便列出所有(可变数量的)元素?我知道 ArrayItems 标签,但它必须在 Expand 标签中使用(同样,我试图在 Value 字段中显示数组元素(无需单击展开按钮)).
有什么建议吗?需要澄清吗?谢谢!
这是不可能的。你已经拥有的是实现你想要的东西的唯一方法(多个带有条件的 DisplayStrings)。
您也可以使用 {elems,[numElems]},这很简单,但也显示指针。
使用 Visual Studio 2017,我正在为一些 类 编写可视化工具,但我 运行 遇到了与 .natvis 代码可读性有关的问题。我有一个自定义数组类型,我想在 Watch window 的 Value 字段 [=28] 中显示其成员=]直接(而不是必须使用展开按钮)。
arrayType 是定义数组类型(稀疏、空、密集、单例)的枚举。 numElems 是数组中的条目数。无需关注这个数据结构;这只是一个例子。这是我当前的 natvis 代码:
<Type Name="MyProject::MyArray"
<DisplayString Condition="numElems == 0">
{arrayType, en}
</DisplayString>
<DisplayString Condition="numElems == 1">
{arrayType, en} {*elems[0]}
</DisplayString>
<DisplayString Condition="numElems == 2">
{arrayType, en} {*elems[0]}, {*elems[1]}
</DisplayString>
<DisplayString Condition="numElems == 3">
{arrayType, en} {*elems[0]}, {*elems[1]}, {*elems[2]}
</DisplayString>
<DisplayString Condition="numElems >= 4">
{arrayType, en} {*elems[0]}, {*elems[1]}, {*elems[2]}, ...
</DisplayString>
</Type>
[请注意,我必须再次重复相同的代码(只是添加一个额外的元素来显示)。由于代码膨胀,我停止显示 3 个元素。]
这将允许 Watch Window(在 Visual Studio 内)以下列方式显示对象:
Name Value
arr1 Sparse 5, 3 ; numElems is 2
arr2 Empty ; numElems is 0
arr3 Singleton 1 ; numElems is 1
arr4 Dense 58, 23, 1, ... ; numElems is >= 4
理想情况下,DisplayString 标记允许其中包含条件。我尝试了以下使用 C++ 三元运算符的变通方法,但没有用。
<Type Name="MyProject::Array"
<DisplayString>
{arrayType, en} {(numElems >= 1) ? *elems[0] : ""}, {(numElems >= 2) ? *elems[1] : ""}, {(numElems >= 3) ? *elems[2] : ""}, {(numElems >= 4) ? "..." : ""}
</DisplayString>
</Type>
请注意,在此代码中,我不必多次重复 DisplayString 标记和重复代码。也许有一种方法可以在 DisplayString 中提供迭代器,以便列出所有(可变数量的)元素?我知道 ArrayItems 标签,但它必须在 Expand 标签中使用(同样,我试图在 Value 字段中显示数组元素(无需单击展开按钮)).
有什么建议吗?需要澄清吗?谢谢!
这是不可能的。你已经拥有的是实现你想要的东西的唯一方法(多个带有条件的 DisplayStrings)。
您也可以使用 {elems,[numElems]},这很简单,但也显示指针。