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

时间:2013-09-13 15:44:19

标签: c macros enums x-macros

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

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

我发现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语句匹配)在宏观内。)

所以现在我很困惑,并且会感激任何建议。

我的难题有解决方案吗?

建议解决方案时,请注意:

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

感谢。

1 个答案:

答案 0 :(得分:1)

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