MSVC 枚举调试

发布于 2024-08-30 09:47:32 字数 91 浏览 4 评论 0原文

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

Is there a quick way of outputting the names of enumerated values? I suppose you know what I mean, and at all this isn't possible as of course all of this data becomes irrelevant during compile process, but I'm using MSVC in debugging mode, so is it possible?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

深爱成瘾 2024-09-06 09:47:32

元宏对智能感知等造成各种破坏,但它们可以使这项任务变得容易......

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

不同的“扩展宏”可以用来填充映射或您选择的其他数据结构。我已经使用这种恐怖的方式从配置文件中解析枚举(因此编写配置文件的人可以使用枚举而不是索引)。

Metamacros cause all sorts of havoc on Intellisense and the like, but they can make this task easy...

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

Possibly even

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

   default:
      return "Invalid enum value";
   }
}

Different "expander macros" can be used to fill maps or other data structures of your choice. I've used this sort of horror to parse enums out of config files (so the person authoring the config file could use the enum rather than the index).

苦笑流年记忆 2024-09-06 09:47:32

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

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

在某些项目中,我有一个奇怪的标头/宏安排,可以使用每个枚举名称使用单个类似声明的项目来构建枚举定义。不过,我对这项技术如何运作的看法在“方便”和“笨拙”之间来回摇摆。

I just put the enum names in a lookup table (or you could use a map<>) with the enum value as a key and have a function perform the lookup.

It's low-tech, but usually not too much of a pain.

In some projects I'd have a weird header/macro arrangement that could build the enum definition using a single declaration-like item per enum name. My opinon on how that technique works wavers back and forth between "handy" or "kludgy" though.

不喜欢何必死缠烂打 2024-09-06 09:47:32

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

This is common C++ problem, that is solved using "Typesafe enum pattern". Usually this is done using some crazy precompiler definitions, or code generators. Quick search for "Typesafe enum pattern C++" can give you these ways. Personally, I have my own code generator for C++ enumerations, which is executed as MSVC custom build step for h-files with enumerations.

儭儭莪哋寶赑 2024-09-06 09:47:32

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

Unfortunately not. All of the enum names are lost by the compiler. The PDB file has them, so the debugger can work it out, but otherwise the only way to do it would be to write a function that does a switch and returns a string.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文