2017-04-18 49 views
0

,如果我有枚举:如何定义枚举的尺寸减去一个元素

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

    MAX_ELEMENTS 
}my_enum 

我怎样才能申报枚举中元素的个数没有一个元素?

是这样的:

uint8 enum_numb_elements = MAX_ELEMENTS - 1 

这是不是一个好的做法做就枚举算术运算。有没有其他方法?

+2

是什么'enum_size'是什么意思? 'sizeof'会给出与MAX_ELEMENTS - 1完全不同的答案。 –

+0

@ n.m。我的意思是枚举中元素的数量 – JohnDoe

+0

枚举中的元素数量与枚举中的最大值不同。你需要枚举可以表示的离散事物的数量还是枚举中的最大值? – djgandy

回答

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

'my_enum_impl_helper__'标记不是必需的,可以省略,以减少名称空间污染。 – user694733

+0

@ user694733 - 非常真实。但是我已经在枚举本身上污染了全局命名空间。不妨留下标签以知道它们是什么联系起来的(许多IDE可以显示封闭标签,'my_enum_impl_helper__'比'anonymous enum 394'更具描述性)。 – StoryTeller

+0

你的第二个解决方案更简单,并敦促使用常识。 – sjsam

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如果加/减枚举,您可以使用my_elem for循环中自动调整,等等。关注的主要问题是,当添加或删除枚举时,需要记住将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]); 
}