我有以下枚举:
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;
有没有办法用第一个创建第二个枚举?
答案 0 :(得分:2)
由于C中的enum
不提供“名称空间”之类的内容,因此您的Items_New
无法编译,因为它会重新声明ITEM_1
,ITEM_2
和ITEM_3
。
让enum
“选择另一个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
之后为。如果您希望能够“在中间插入项目”,则需要通过留出一些空间来准备第一个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_1
和ITEM_3
ITEM_2_1
到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
后面的常量的数值无关。
答案 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)
也许枚举不是解决问题的正确方法。
使用普通的旧宏怎么样?你没有得到“自动增量”功能,但也许你根本不需要它。如何说明你遇到的实际问题,而不是尝试用枚举继承来解决它?