有没有一种快速输出枚举值名称的方法?我想你知道我的意思,并且完全不可能,因为在编译过程中所有这些数据都变得无关紧要,但是我在调试模式下使用MSVC,所以可能吗?MSVC枚举调试
MSVC枚举调试
回答
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";
}
}
不同的“扩展宏”,可以使用填写您选择的地图或其他数据结构。我用这种恐怖来解析配置文件中的枚举(所以编写配置文件的人可以使用枚举而不是索引)。
不幸的不是。所有的枚举名都被编译器丢失了。 PDB文件有它们,所以调试器可以解决它,但否则唯一的方法就是编写一个执行切换并返回字符串的函数。
“PDB文件有他们”:如何访问它们? – 2010-04-29 18:35:29
我不知道它的名字,但有一个图书馆,你可以链接到从PDB获取信息。 – 2010-04-29 18:42:02
这是“调试接口访问SDK”(http://msdn.microsoft.com/en-us/library/x93ctkx8.aspx) – 2010-04-29 18:52:33
我只是将枚举名称放在查找表中(或者您可以使用map<>
)并将枚举值作为关键字并且有一个函数执行查找。
这是低科技,但通常不会太痛苦。
在一些项目中,我有一个奇怪的头/宏安排,可以使用每个枚举名的单个声明类项来构建枚举定义。我对这种技术如何在“方便”或“杂乱”之间来回摆动的看法。
这就是我试图避免:) – 2010-04-29 18:34:39
这是常见的C++问题,即使用“Typesafe枚举模式”解决。通常这是使用一些疯狂的预编译器定义或代码生成器完成的。快速搜索“Typesafe enum pattern C++”可以为您提供这些方法。就我个人而言,我有我自己的C++枚举的代码生成器,它作为MSVC自定义生成步骤执行,用于具有枚举的h文件。
注意:你有1,337代表。 – 2010-04-29 18:44:44
@oh boy:注意!我不会upvote然后.. :-P – Macke 2010-04-29 18:46:19
@男孩,马库斯Lindblom - 你是什么意思? – 2010-04-29 18:52:33
- 1. MSVC常量枚举类型
- 2. 在枚举枚举中调用.Distinct()
- 3. 调试例程MSVC++特定?
- 4. 尝试在C#枚举
- 5. “枚举类”仿真或固体替代的MSVC 10.0
- 6. 用于指定C枚举大小的GCC/Clang/MSVC扩展?
- 7. 带枚举的MySQL枚举
- 8. Java枚举找到枚举
- 9. Java类枚举枚举类
- 10. 在枚举中枚举
- 11. 转换枚举来枚举
- 12. 重新枚举枚举
- 13. 在调整枚举列表
- 14. Groovy枚举 - 调用链
- 15. 试图测试枚举的方法
- 16. 在枚举语句中枚举mysql枚举
- 17. 枚举
- 18. 枚举
- 19. 枚举
- 20. 枚举
- 21. 枚举
- 22. 爪哇枚举和Objective-C枚举
- 23. 与protobuf的枚举替换C++枚举
- 24. Java的枚举和PostgreSQL枚举
- 25. 获取枚举并发送枚举值
- 26. Node.js native枚举中的枚举类型
- 27. 是枚举Java中的枚举
- 28. 为什么枚举包括可枚举
- 29. 将枚举映射到“子枚举”
- 30. 如何在保持枚举枚举
这可能不是你想要的,但是是一个不同的方法来解决问题。如果您生成PDB,读取PDB就没有问题,但如果您要分发代码并打算以某种方式自动在UI中使用枚举值,则需要使用不同的解决方案。 – 2010-04-29 18:43:15