我们的系统有很多枚举,表示事件、错误等等。
我正在尝试构建基础设施,使我们能够将每个接收到的事件或错误消息记录为字符串(而不是普通整数),而无需构建和维护每个枚举的两个列表。
我发现X宏技术非常适合我的需求。因此,不需要这样做:
我正在操作以下内容:
事实证明,C不允许在宏内使用条件编译。Eclipse显示“宏中的宏拼接无效”,并且当我尝试构建代码时,由于“错误:'#'后面没有宏参数”而失败(行号与宏内第一个#if语句相匹配)。
所以现在我非常困惑,希望得到任何建议。
如果要提出解决方案,请注意以下内容:
- 我不能每个枚举值都有一个列表。 - 这个解决方案需要应用到大量的枚举类型。(也就是说我不能将每个枚举类型放在它自己的.h文件里)
谢谢。
我正在尝试构建基础设施,使我们能够将每个接收到的事件或错误消息记录为字符串(而不是普通整数),而无需构建和维护每个枚举的两个列表。
我发现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显示“宏中的宏拼接无效”,并且当我尝试构建代码时,由于“错误:'#'后面没有宏参数”而失败(行号与宏内第一个#if语句相匹配)。
所以现在我非常困惑,希望得到任何建议。
如果要提出解决方案,请注意以下内容:
- 我不能每个枚举值都有一个列表。 - 这个解决方案需要应用到大量的枚举类型。(也就是说我不能将每个枚举类型放在它自己的.h文件里)
谢谢。