如何定义枚举的大小减去一个元素

时间:2017-04-18 09:26:10

标签: c enums

如果我有枚举:

typedef enum
{
   A= 0,
   B= 1,
   C =2,
   D= 4,
   E= 6,
   F= 8,
   G= 10,

   MAX_ELEMENTS
}my_enum

如何在没有一个元素的情况下声明 enum 中的元素数量?

类似的东西:

uint8 enum_numb_elements = MAX_ELEMENTS - 1

枚举进行算术运算不是一个好习惯。还有其他方法吗?

2 个答案:

答案 0 :(得分:4)

你可以定义它,但是它涉及一些不太令人愉快的锅炉板,并且污染全局/标签命名空间很多/位。

如果您利用臭名昭着的X macros来完成工作,它将如下所示:

#define LIST_OF_ENUM_IDS \
    X(A, 0) \
    X(B, 1) \
    X(C, 2) \
    X(D, 4) \
    X(E, 6) \
    X(F, 8) \
    X(G, 10)

#define X(id, val) \
  id = val,

typedef enum
{
  LIST_OF_ENUM_IDS
} my_enum;

#undef X

#define X(id, val) id##_impl_helper,

enum my_enum_impl_helper__ {
  LIST_OF_ENUM_IDS
  MY_ENUM_MAX_ELEMENTS
};

#undef X

实例:On Ideone

或者,一些商店将依赖大胆的评论和代码审查来捕捉这些事情:

/********************************************
*
**
*** ATTENTION! Remember to bump MAX_ELEMENTS
*** should you add new values to the enum
**
*
********************************************/
typedef enum
{
   A= 0,
   B= 1,
   C =2,
   D= 4,
   E= 6,
   F= 8,
   G= 10,

   MAX_ELEMENTS = 7 /// Bump this if you add new values!
}my_enum;

尽管存在人为因素,但 可以工作并不是太糟糕。

答案 1 :(得分:0)

我更喜欢保持枚举连续使用C的“功能”。

typedef enum
{
   A,
   B,
   C,
   D,
   E,
   F,
   G,
   MAX_ELEMENTS
} my_enum;

int element_array[MAX_ELEMENTS] =
{
    0,
    1,
    2,
    4,
    6,
    8,
    10
};

鉴于此构造,如果添加/减去枚举,则NUM_ELEMENTS会自动调整,并且您可以在for循环中使用my_elem等。关注的主要问题是您需要记住在添加或添加时将element_array与my_enum一起维护删除枚举。

for循环示例

my_elem elem;
for (elem = (my_elem)0; elem < MAX_ELEMENTS; elem++)
{
    printf("The value of element %d is %d\n", elem, element_array[elem] );
}