我有以下枚举:
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;
有没有办法使用第一个枚举创建第二个枚举?
由于 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
旨在隐藏的东西。如果您想以特定顺序迭代
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
后面的常量数值无关。
也许枚举不是解决您的问题的正确方法。
使用普通的旧宏怎么样?您没有获得“自动增量”功能,但也许您甚至不需要它。陈述您遇到的实际问题,而不是尝试通过枚举继承来解决它怎么样?
可以参考第一个的值,但是这样会很重复:
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. */
};