NatVis 显示枚举的子字符串
Posted
技术标签:
【中文标题】NatVis 显示枚举的子字符串【英文标题】:NatVis display substring of enum 【发布时间】:2019-12-02 15:06:20 【问题描述】:我们经常为我们的枚举使用前缀。
在 NatVis 中显示全名非常冗长。
是否可以删除枚举名称的前缀(又名返回枚举名称的子字符串)?
enum FooFormat
FooFormat_Foo,
FooFormat_Bar,
FooFormat_Baz,
FooFormat_COUNT
;
struct Bar
FooFormat format;
;
<AutoVisualizer>
<Type Name="Bar">
<DisplayString>fmt=format,How-to-get-substring-of-enum-name-?</DisplayString>
</Type>
</AutoVisualizer>
【问题讨论】:
【参考方案1】:为此使用format specifier en
:
<AutoVisualizer>
<Type Name="Bar">
<DisplayString>fmt=format,en</DisplayString>
</Type>
</AutoVisualizer>
例如:
Bar f;
f.format = FooFormat_Bar;
... // breakpoint here
【讨论】:
【参考方案2】:这不起作用:
<Type Name="FooFormat">
<DisplayString Condition="this==FooFormat::FooFormat_Foo">Foo</DisplayString>
<DisplayString Condition="this==FooFormat::FooFormat_Bar">Bar</DisplayString>
<DisplayString>"bla"</DisplayString>
</Type>
但幸运的是,这行得通。当然,这只有在您的格式字符串不依赖于太多变量时才可行,否则您最终可能会得到大量的条件 DisplayString。
<Type Name="Bar">
<DisplayString Condition="format==FooFormat::FooFormat_Foo">fmt=Foo</DisplayString>
<DisplayString Condition="format==FooFormat::FooFormat_Bar">fmt=Bar</DisplayString>
<DisplayString>fmt=format</DisplayString>
</Type>
另一种方法,如果您使用 C++11 或更高版本,我会使用范围枚举 (enum class FooFormat Foo, Bar, Baz, COUNT ;
)。这些比常规枚举好一点,而不是FooFormat_Foo
,你写FooFormat::Foo
。所以你仍然有详细的代码,但是枚举值有一个更短的标识符,并且 natvis 只显示Foo
。当然,这只适用于 C++,不适用于 C。
【讨论】:
以上是关于NatVis 显示枚举的子字符串的主要内容,如果未能解决你的问题,请参考以下文章