【问题标题】:NatVis display substring of enumNatVis 显示枚举的子字符串
【发布时间】: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>

【问题讨论】:

    标签: natvis


    【解决方案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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多