我们的系统有大量的枚举,表示事件,错误等内容。
我正在尝试构建基础结构,允许我们将每个接收到的事件或错误消息记录为字符串(而不是普通整数),而不必为每个枚举构建和维护两个列表。
我发现X Macro技术非常适合我的需要。因此,而不是这样做:
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语句匹配)在宏观内。)
所以现在我很困惑,并且会感激任何建议。
我的难题有解决方案吗?
建议解决方案时,请注意:
感谢。
答案 0 :(得分:1)
P99有P99_DECLARE_ENUM
和朋友,可以让你很好地处理enum
。您将获得返回带有名称等的字符串的函数。这应该对条件编译很有效。唯一的限制是您可以在一个enum
类型中拥有的值的总数,但可能会有一些方法来扩展它。