从现有枚举常量创建一个新的枚举常量
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 中的 enum
s 不提供像 "name space" 这样的东西,你的 Items_New
不会编译,因为它重新声明 ITEM_1
,ITEM_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_1
和 ITEM_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_1
到 ITEM_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
.
后面的常量数值无关
也许枚举不是解决您问题的正确方法。
使用普通的旧宏怎么样?您没有获得 "autoincrement" 功能,但也许您甚至不需要它。陈述你遇到的实际问题,而不是尝试用枚举继承来解决它怎么样?
我有以下枚举:
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 中的 enum
s 不提供像 "name space" 这样的东西,你的 Items_New
不会编译,因为它重新声明 ITEM_1
,ITEM_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_1
和 ITEM_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
toITEM_3
taking into accountITEM_2_1
andITEM_2_2
从 ITEM_1
到 ITEM_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
.
也许枚举不是解决您问题的正确方法。
使用普通的旧宏怎么样?您没有获得 "autoincrement" 功能,但也许您甚至不需要它。陈述你遇到的实际问题,而不是尝试用枚举继承来解决它怎么样?