2011-01-07 153 views
26

我瞭解第一個,但第二個?何時和爲什麼要這樣做?使用不帶變量名的枚舉

enum cartoon { HOMER, MARGE, BART, LISA, MAGGIE }; 

enum { HOMER, MARGE, BART, LISA, MAGGIE }; 
+4

當你看過多辛普森一家? – 2011-01-07 07:37:11

+4

沒有這樣的東西.. – 2011-01-07 07:44:10

+0

@Noah:你讓我覺得這可能確實是非法的,而且我誤導了,所以我在g ++中編譯了一個類似於我的例子的測試。它編譯並運行正常,雖然我檢查過的在線引用確實沒有顯示這個語法選項。 – davka 2011-01-07 08:42:57

回答

24

您可以在類,這使得它的範圍定義這樣的枚舉,並有助於揭露類的功能,例如,

class Encryption { 
public: 
    enum { DEFAUTL_KEYLEN=16, SHORT_KEYLEN=8, LONG_KEYLEN=32 }; 
    // ... 
}; 

byte key[Encryption::DEFAUTL_KEYLEN]; 
6

這只是創建具有相應值的常量表達式,而不不僅僅是int之外的類型,所以你不能用一個無名枚舉作爲一種什麼,你將不得不簡單地接受int和然後與常數進行比較。

事情是這樣的:

void doSomething(int c); 

對戰是這樣的:

void doSomething(cartoon c); 

順便說一句,你的實現是相同的,所以在無名枚舉的情況下,唯一真正的缺點是強大的打字。

+0

除了它們實際上不是常量,它們是*常量表達式*。有時會有很大的差異。例如,您可以將參考或地址作爲常數。你不能用enum符號來做到這一點。 – 2011-01-07 17:40:06

4

枚舉,聯合,結構和類在語法中有一個共同部分共享相同的 這個unamed模式是rarelly使用。 但有時您可能會發現這一點。

typedef enum { HOMER, MARGE, BART, LISA, MAGGIE } cartoont; 

或者,如果你有一個包含只有幾個國家的單一變量。

enum { HOMER, MARGE, BART, LISA, MAGGIE } my_var; 

這可以避免以下聲明。

enum cartoon { HOMER, MARGE, BART, LISA, MAGGIE }; 
cartoon my_var; 
6

第二個是未命名的enum。當你需要這些字段時,我可以很有用,但是你不打算聲明這個枚舉類型的變量。爲了提供一個「非常C++」的使用示例,您經常會在模板元編程中看到這一點,其中枚舉被用作「編譯時返回值」,而無需聲明此類變量:

template<class T> 
struct some_metafunction 
{ 
    enum { res = 0; }; 
}; 
2

我只是提供了一個現實生活中使用anonyous enum的例子,我在嵌入式項目中遇到過。 在該項目中,EEPROM用於存儲一些參數。假設這些參數是紙箱字符的年齡,每個參數在連續地址中的大小爲1個字節。

當處理器開機時,這些參數被複制到存儲在ROM中的數組中。

uint8_t ROM_AGE[END_AGE] 

如果我們定義了一個anomymous枚舉這裏:

enum { HOMER_AGE, MARGE_AGE, BART_AGE, LISA_AGE, MAGGIE_AGE, END_AGE }; 

然後枚舉的關鍵詞可被用於索引每個角色的年齡一樣ROM_AGE[HOMER_AGE]。 通過使用這個枚舉,可讀性比使用ROM_AGE[0]好得多。