natvis - NatVis 显示枚举的子字符串
问题描述
我们经常为我们的枚举使用前缀。
在 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>
解决方案
这不起作用:
<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。
推荐阅读
- javascript - discord.js 如何使从数组发送文本的 forEach 等待用户的回答(awaitmessages)?
- pine-script - Pine Script 获得特定日期的最高值
- node.js - 反应前端,节点后端CORS问题
- mongodb - 如何将一个值从一个数组复制到另一个字段然后弹出它?
- python - 如何重写以下内容以使其与模型管理器一起使用?
- javascript - Discord.js 踢/禁止命令顶级角色
- github - 通过 Github api v3 和 javascript 获取所有 github repo
- typescript - TypeScript:如何扩展这种相似的类型?
- c++ - 在 uint32_t 范围内转换 uint64_t 范围
- sql - 同一脚本中的 Postgres COPY 和 SQL 命令