MSVC枚举调试

时间:2010-04-29 18:29:33

标签: c++ enums visual-c++

是否有快速输出枚举值的名称?我想你知道我的意思,而这一切都是不可能的,因为当然所有这些数据在编译过程中都变得无关紧要,但是我在调​​试模式下使用MSVC,这样可能吗?

4 个答案:

答案 0 :(得分:1)

我只是将枚举名称放在查找表中(或者你可以使用map<>)将枚举值作为键并让函数执行查找。

这是低技术,但通常不会太痛苦。

在某些项目中,我有一个奇怪的标题/宏安排,可以使用每个枚举名称的单个类似声明的项来构建枚举定义。关于这种技术如何在“方便”或“kludgy”之间来回摇摆的观点。

答案 1 :(得分:1)

Metamacros对Intellisense等造成各种各样的破坏,但他们可以轻松完成这项任务......

#define MY_ENUMS(e_) \
   e_(Enum_A), \
   e_(Enum_B), \
   e_(Enum_C), \

#define ENUM_EXPANDER(e_)  e
enum MyEnums
{
   MY_ENUMS(ENUM_EXPANDER)
   CountOfMyEnums
};

#define STRING_EXPANDER(e_)  #e_
const char* g_myEnumStrings[] =
{
   MY_ENUMS(STRING_EXPANDER)
};

甚至可能

#define CASE_EXPANDER(e_)  case e_: return #e_;
const char* GetEnumName(MyEnums e)
{
   switch (e)
   {
      MY_ENUMS(CASE_EXPANDER)

   default:
      return "Invalid enum value";
   }
}

可以使用不同的“扩展器宏”来填充您选择的地图或其他数据结构。我使用这种恐怖来解析配置文件中的枚举(因此创作配置文件的人可以使用枚举而不是索引)。

答案 2 :(得分:1)

这是常见的C ++问题,使用“Typesafe枚举模式”解决。通常这是使用一些疯狂的预编译器定义或代码生成器完成的。快速搜索“Typesafe enum pattern C ++”可以为您提供这些方法。就个人而言,我有自己的C ++枚举代码生成器,它作为带有枚举的h文件的MSVC自定义生成步骤执行。

答案 3 :(得分:0)

不幸的是没有。编译器丢失了所有枚举名称。 PDB文件具有它们,因此调试器可以解决它,但是否则唯一的方法是编写一个执行切换并返回字符串的函数。