我正在尝试使用msvc natvis visualizer实现个人可视化工具。问题是我不知道怎么做关于工会。
结构(value
)包含两个结构(string1
和string2
)的并集的简单示例:
typedef struct value
{ int type; /* variable type */
union
{
string1 sval;
string2 sval2;
} t;
}
typedef struct string1
{
int size;
char *data;
} aString1;
typedef struct string2
{
int size;
char *data;
} aString2;
我可以使用natvis中的以下代码为string1和string2创建两个类型:
<Type Name="string1"> /// (A) preview
<DisplayString>{{ string 1 }}</DisplayString>
<Expand>
<Item Name="text">data</Item>
</Expand>
</Type>
<Type Name="string2"> /// (B) preview
<DisplayString>{{ string 2 }}</DisplayString>
<Expand>
<Item Name="text">data</Item>
</Expand>
</Type>
但是当我有一个“值”变量(联合)时,如何自动预览这些类型。 我坚持这一点:(假设变量类型等于1表示string1,而2表示string2)。我做了:
<Type Name="value">
<DisplayString>{{Value}}</DisplayString>
<Expand>
<Synthetic Name="String 1 Name" Condition="type==1"> // assume type of string1 = 1
/// here i want to call preview I have created for string1 in (A)
</Synthetic>
<Synthetic Name="String 2 Name" Condition="type==2"> // assume type of string2 = 2
/// here i want to call preview I have created for string2 in (B)
</Synthetic>
</Expand>
</Type>
所以我希望根据类型值,调试将显示正确的可视化器。 你能解释一下如何处理与natvis的联盟吗?还是某个地方的例子? (官方的msvc文档不考虑工会..) 显而易见,这个例子毫无意义,但只是为了理解,因为我有一个更复杂的联盟。
答案 0 :(得分:1)
以下内容应该有效:
<Type Name="value">
<DisplayString Condition="type == 1">{t.sval}</DisplayString>
<DisplayString Condition="type == 2">{t.sval2}</DisplayString>
<Expand>
<ExpandedItem Condition="type == 1">t.sval</ExpandedItem>
<ExpandedItem Condition="type == 2">t.sval2</ExpandedItem>
</Expand>
</Type>
ExpandedItem 删除了union的视图,并使用 string1 resp。取而代之的是 string2 扩展,具体取决于 type 的值。
我还没有尝试使用我在这里发布的XML,因此可能会出现一些语法错误,但您应该可以通过微调(如果有的话)来使用它。