2017-04-18 25 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]); 
}