【问题标题】:How to define size of enum minus one element如何定义枚举的大小减去一个元素
【发布时间】:2017-04-18 09:26:10
【问题描述】:

如果我有枚举:

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

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

【问题讨论】:

  • enum_size 是什么意思? sizeof 会给出与MAX_ELEMENTS - 1 截然不同的答案。
  • 你查过[ this ]的答案吗?
  • 两者都没有给出枚举中的元素数量。获得这个数字的唯一方法是手工计算元素。
  • @sjsam 这不适用于像这个问题那样的稀疏枚举。
  • @kingkong 我认为您最好定义您要解决的更广泛的问题以及为什么您的枚举存在差距等。可能有更好的方法来解决您的问题。

标签: c enums


【解决方案1】:

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

如果你利用臭名昭著的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


或者,一些商店将转而依靠大胆的 cmets 和代码审查来捕捉这些东西:

/********************************************
*
**
*** 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;

尽管有人为因素,可以工作并不算太糟糕。

【讨论】:

  • my_enum_impl_helper__ 标签不是必需的,可以省略以减少命名空间污染。
  • @user694733 - 非常正确。但是我已经用枚举本身污染了全局命名空间。不妨留下标签以了解它与什么相关联(许多 IDE 可以显示封闭标签,my_enum_impl_helper__ 比“匿名枚举 394”更具描述性)。
  • 您的第二个解决方案更简单,并敦促使用常识。
  • @sjsam - 我发现先看到丑陋的事物有助于诱使人们采用更明智的解决方案。
【解决方案2】:

我更喜欢让枚举保持连续以利用 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] );
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-16
    • 1970-01-01
    • 2016-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-11
    相关资源
    最近更新 更多