gpt4 book ai didi

c - 在 C 中对条件编译的枚举进行字符串化

转载 作者:太空宇宙 更新时间:2023-11-03 23:51:42 24 4
gpt4 key购买 nike

我们的系统有大量枚举表示事件、错误等内容。

我正在尝试构建允许我们将每个接收到的事件或错误消息记录为字符串(而不是普通整数)的基础架构,而无需为每个枚举构建和维护两个列表。

我发现 X 宏技术非常适合我的需要。因此,与其这样做:

typedef enum
{
valA,
valB,
valC
} some_enum;

const char* some_enum_strings[] =
{
"valA",
"valB",
"valC"
};

我这样做:

#define DEF_STRINGIFY(_x_) #_x_,
#define DEF_ENUM(_x_) _x_,

#define ENUM_NAME(_x_) \
_x_(valA) \
_x_(valB) \
_x_(valC)

typedef enum
{
SOME_ENUM(DEF_ENUM)
} some_enum;

const char* some_enum_strings[] =
{
SOME_ENUM(DEF_STRINGIFY)
};

这一切都很好,但问题是我们的一些枚举非常大,包含数百个值并充满了条件编译,看起来有点像这样

typedef enum
{
valA,
#if defined (SYS_A)
valB,
#endif
valC,
valD,
#if defined (SYS_B) || defined (SYS_D)
valE,
#else
valF,
#endif
valG
/* etc. */
} some_enum;

事实证明,C 不允许在宏中进行条件编译。Eclipse 声称“在宏中无效使用宏粘贴:SOME_ENUM,并且当我尝试构建代码时由于“错误:‘#’后面没有宏参数”而失败(行号与第一个 #if 语句匹配在宏内)。

所以现在我很困惑,非常感谢任何建议。

我的难题有解决方案吗?

在提出解决方案时,请注意:

  • 每个枚举不能有多个列表
  • 此解决方案需要应用于大量枚举(即,我无法真正将每个枚举放入其自己的 .h 文件中)

谢谢。

最佳答案

P99P99_DECLARE_ENUM 和可以让您很好地处理 enum 的 friend 。您获得返回带有名称等的字符串的函数。这对于条件编译应该是健壮的。唯一的限制是您可以在一个 enum 类型中拥有的值的总数,但可能有一些方法可以扩展它。

关于c - 在 C 中对条件编译的枚举进行字符串化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18790332/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com