从现有枚举常量创建新的枚举常量

时间:2015-02-10 16:17:43

标签: c enums

我有以下枚举:

typedef enum Items
{
    ITEM_1
  , ITEM_2
  , ITEM_3 
} Items_t

我想使用第一个创建一个新的枚举。结果将是这样的:

typedef enum Items_New
{
    ITEM_1
  , ITEM_2
  , ITEM_2_1
  , ITEM_2_2
  , ITEM_3 
} Items_New_t;

有没有办法用第一个创建第二个枚举?

3 个答案:

答案 0 :(得分:2)

由于C中的enum不提供“名称空间”之类的内容,因此您的Items_New无法编译,因为它会重新声明ITEM_1ITEM_2ITEM_3

enum“选择另一个enum停止的地方”的一种方法如下:

typedef enum Items_New
{
    ITEM_2_1 = ITEM_3+1
,   ITEM_2_2
}   Items_New_t;

ITEM_2_1ITEM_2_2相关联的数值在 ITEM_3之后为。如果您希望能够“在中间插入项目”,则需要通过留出一些空间来准备第一个enum,例如:

typedef enum Items
{
    ITEM_1 = 1000
,   ITEM_2 = 2000
,   ITEM_3 = 3000
} Items_t;

typedef enum Items_New
{
    ITEM_2_1 = ITEM_2 + 100
,   ITEM_2_2 = ITEM_2 + 200
}   Items_New_t;
  

考虑到ITEM_1ITEM_3

,我无法使用从ITEM_2_1ITEM_2_2的循环

ITEM_1ITEM_3进行循环是一个非常糟糕的主意,因为这样的循环会对enum的数值进行假设 - 这就是enum s旨在隐藏。如果您想按特定顺序迭代enum个值,请创建一个数组:

Items_New_t items_in_order[] = {ITEM_1, ITEM_2, ITEM_2_1, ITEM_2_2, ITEM_3};
...
for (int i = 0 ; i != sizeof(items_in_order)/sizeof(items_in_order[0]) ; i++) {
    Items_New_t item = items_in_order[i];
    ...
}

现在保证您的迭代顺序与enum后面的常量的数值无关。

答案 1 :(得分:0)

不,你不能“连接”枚举。

你可以做的是参考第一个的值,但这将是非常重复的:

enum OldEnum {
  OLD_ITEM_1 = 100,
  OLD_ITEM_2 = 101,
};

enum NewEnum {
  NEW_ITEM_1 = OLD_ITEM_1,
  NEW_ITEM_2 = OLD_ITEM_2,
  NEW_ITEM_3  /* This will be 102. */
};

答案 2 :(得分:0)

也许枚举不是解决问题的正确方法

使用普通的旧宏怎么样?你没有得到“自动增量”功能,但也许你根本不需要它。如何说明你遇到的实际问题,而不是尝试用枚举继承来解决它?