是否有快速输出枚举值的名称?我想你知道我的意思,而这一切都是不可能的,因为当然所有这些数据在编译过程中都变得无关紧要,但是我在调试模式下使用MSVC,这样可能吗?
答案 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文件具有它们,因此调试器可以解决它,但是否则唯一的方法是编写一个执行切换并返回字符串的函数。