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

问题描述 投票:0回答:3

我有以下枚举:

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 enums
3个回答
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
 旨在隐藏的东西。如果您想以特定顺序迭代 
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

 后面的常量数值无关。


0
投票

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

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


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. */ };
    
© www.soinside.com 2019 - 2024. All rights reserved.