我瞭解第一個,但第二個?何時和爲什麼要這樣做?使用不帶變量名的枚舉
enum cartoon { HOMER, MARGE, BART, LISA, MAGGIE };
enum { HOMER, MARGE, BART, LISA, MAGGIE };
我瞭解第一個,但第二個?何時和爲什麼要這樣做?使用不帶變量名的枚舉
enum cartoon { HOMER, MARGE, BART, LISA, MAGGIE };
enum { HOMER, MARGE, BART, LISA, MAGGIE };
您可以在類,這使得它的範圍定義這樣的枚舉,並有助於揭露類的功能,例如,
class Encryption {
public:
enum { DEFAUTL_KEYLEN=16, SHORT_KEYLEN=8, LONG_KEYLEN=32 };
// ...
};
byte key[Encryption::DEFAUTL_KEYLEN];
這只是創建具有相應值的常量表達式,而不不僅僅是int
之外的類型,所以你不能用一個無名枚舉作爲一種什麼,你將不得不簡單地接受int
和然後與常數進行比較。
事情是這樣的:
void doSomething(int c);
對戰是這樣的:
void doSomething(cartoon c);
順便說一句,你的實現是相同的,所以在無名枚舉的情況下,唯一真正的缺點是強大的打字。
除了它們實際上不是常量,它們是*常量表達式*。有時會有很大的差異。例如,您可以將參考或地址作爲常數。你不能用enum符號來做到這一點。 – 2011-01-07 17:40:06
枚舉,聯合,結構和類在語法中有一個共同部分共享相同的 這個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;
第二個是未命名的enum
。當你需要這些字段時,我可以很有用,但是你不打算聲明這個枚舉類型的變量。爲了提供一個「非常C++」的使用示例,您經常會在模板元編程中看到這一點,其中枚舉被用作「編譯時返回值」,而無需聲明此類變量:
template<class T>
struct some_metafunction
{
enum { res = 0; };
};
我只是提供了一個現實生活中使用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]
好得多。
當你看過多辛普森一家? – 2011-01-07 07:37:11
沒有這樣的東西.. – 2011-01-07 07:44:10
@Noah:你讓我覺得這可能確實是非法的,而且我誤導了,所以我在g ++中編譯了一個類似於我的例子的測試。它編譯並運行正常,雖然我檢查過的在線引用確實沒有顯示這個語法選項。 – davka 2011-01-07 08:42:57