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

Create a new enumeration constant from an existing one

我有以下枚举:

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;

有什么方法可以使用第一个枚举创建第二个枚举吗?

不,你不能 "concatenate" 枚举。

你可以参考第一个的值,但是会很重复:

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. */
};

因为 C 中的 enums 不提供像 "name space" 这样的东西,你的 Items_New 不会编译,因为它重新声明 ITEM_1ITEM_2, 和 ITEM_3.

制作 "picks up where the other enum left off" 的 enum 的一种方法如下:

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

ITEM_2_1ITEM_2_2 关联的数值将是 ITEM_3 的值之后。如果你想能够"insert items in the middle",你需要通过留下一些space来准备你的第一个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;

I can not use a loop from ITEM_1 to ITEM_3 taking into account ITEM_2_1 and ITEM_2_2

ITEM_1ITEM_3 进行循环是一个非常糟糕的主意,因为这样的循环对 enum 的数值进行了假设 - enums 旨在隐藏。如果您想以特定顺序遍历 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.

后面的常量数值无关

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

使用普通的旧宏怎么样?您没有获得 "autoincrement" 功能,但也许您甚至不需要它。陈述你遇到的实际问题,而不是尝试用枚举继承来解决它怎么样?