我们经常使用前缀作为枚举。
在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>发布于 2019-12-30 18:01:43
这不起作用:
<Type Name="FooFormat">
<DisplayString Condition="this==FooFormat::FooFormat_Foo">Foo</DisplayString>
<DisplayString Condition="this==FooFormat::FooFormat_Bar">Bar</DisplayString>
<DisplayString>"bla"</DisplayString>
</Type>但幸运的是,这是可行的。当然,只有在您的格式字符串不依赖于太多变量的情况下,这才是可行的,否则您可能会得到大量的条件DisplayStrings。
<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。
发布于 2020-02-07 20:53:20
使用format specifier en执行以下操作:
<AutoVisualizer>
<Type Name="Bar">
<DisplayString>fmt={format,en}</DisplayString>
</Type>
</AutoVisualizer>例如:
Bar f;
f.format = FooFormat_Bar;
... // breakpoint here

https://stackoverflow.com/questions/59141655
复制相似问题