2012-08-16 290 views
3

獲取信息,我有2種枚舉類型:上枚舉類型

typedef enum {a=0, a1=3, a2=5} NX; 
typedef enum {c=-1, c1=4, c2=7} NY; 

我想編寫一個表達式,枚舉類型的給定一個名稱/實例將返回我的第一個元素的值。一個可能的解決方案是始終添加固定名稱元素,例如

typedef enum {a=0, first=a, a1, a2, last=a2} 

但是,也許有一種更優雅的方式。

有沒有辦法在運行時獲取枚舉中的元素數量?

+1

C++的相同問題:[鏈接](http://stackoverflow.com/a/159018/335858)。總結:你的方法就是答案。 – dasblinkenlight 2012-08-16 10:09:40

回答

0

不,sizeof()不適用於枚舉的。在運行時不可能獲取元素的數量。
有一個流行的方法來檢查枚舉的最後一個元素值,以確定在給定的枚舉元素的量,即:

enum Type {A = 0, B, C, LAST}; 
printf("'Type' enum has %d number of elements", LAST); 
+0

當然,這僅適用於順序枚舉。 – 2012-08-16 10:16:20

+0

注意:對於第一個元素爲0 **的順序枚舉**有效。 – rpsml 2012-08-16 10:25:34

+0

是的,但這可以很容易地計算出來,正如你在答案中指出的一樣。 – 2012-08-16 11:08:38

0

如果枚舉的數字是連續的(和你的前兩個例子,他們是)您可以隨時使用

typedef enum {first = -18, b, c, d, last } BlahBlah; 
(...) 
int nptElements = last - first + 1; 

獲取元素的數量。當然,這需要第一個和最後一個知識...

+0

當然,但我不想依賴代碼中的枚舉值名稱。我想知道是否有內置的編譯器,在任何枚舉上工作。 – tblum 2012-08-16 10:10:31

+0

他們不順序,更新了問題。 – tblum 2012-08-16 10:13:08

+0

然後,據我所知,要麼你需要的信息存儲在枚舉本身(或在一系列的#defines或變量),或者你使用一個數組,在這種情況下,你失去了標籤功能。 – rpsml 2012-08-16 10:18:43