2010-04-29 60 views
2

有没有一种快速输出枚举值名称的方法?我想你知道我的意思,并且完全不可能,因为在编译过程中所有这些数据都变得无关紧要,但是我在调​​试模式下使用MSVC,所以可能吗?MSVC枚举调试

回答

1

Metamacros造成智能感知等的各种破坏,但他们可以让这个任务很容易...

#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"; 
    } 
} 

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

+0

这可能不是你想要的,但是是一个不同的方法来解决问题。如果您生成PDB,读取PDB就没有问题,但如果您要分发代码并打算以某种方式自动在UI中使用枚举值,则需要使用不同的解决方案。 – 2010-04-29 18:43:15

0

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

+0

“PDB文件有他们”:如何访问它们? – 2010-04-29 18:35:29

+0

我不知道它的名字,但有一个图书馆,你可以链接到从PDB获取信息。 – 2010-04-29 18:42:02

+0

这是“调试接口访问SDK”(http://msdn.microsoft.com/en-us/library/x93ctkx8.aspx) – 2010-04-29 18:52:33

1

我只是将枚举名称放在查找表中(或者您可以使用map<>)并将枚举值作为关键字并且有一个函数执行查找。

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

在一些项目中,我有一个奇怪的头/宏安排,可以使用每个枚举名的单个声明类项来构建枚举定义。我对这种技术如何在“方便”或“杂乱”之间来回摆动的看法。

+0

这就是我试图避免:) – 2010-04-29 18:34:39

1

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

+0

注意:你有1,337代表。 – 2010-04-29 18:44:44

+0

@oh boy:注意!我不会upvote然后.. :-P – Macke 2010-04-29 18:46:19

+0

@男孩,马库斯Lindblom - 你是什么意思? – 2010-04-29 18:52:33