2011-01-07 12 views
26

Ich verstehe die erste, aber die zweite? Wann und warum würdest du das tun?Die Verwendung von Enum ohne Variablenname

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

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

wenn du zu viel Simpsons gesehen hast ??? –

+4

Nichts dergleichen .. –

+0

@Noah: Du hast mich glauben gemacht, dass es vielleicht illegal ist und ich irreführe, also habe ich einen Test ähnlich meinem Beispiel auf g ++ kompiliert. Es kompiliert und läuft in Ordnung, obwohl Online-Referenzen, die ich überprüft habe, diese Syntaxoption nicht anzeigen. – davka

Antwort

24

Sie solche enum in einer Klasse definieren können, die es einen Bereich gibt, und hilft aussetzen Fähigkeiten der Klasse, zB

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

byte key[Encryption::DEFAUTL_KEYLEN]; 
+2

Jetzt sehe ich, ich habe mich gefragt, wie du es benutzt hast. Also bringt es es in den Geltungsbereich und verwendet es, indem es den ClassName :: enum -Wert ausführt, also sind enum {blah, hah, lol} im Prinzip über ClassName :: blah usw. zugänglich. Vielen Dank. – RoR

6

Dies erzeugt einfach konstante Ausdrücke, die die jeweiligen Werte haben, ohne einen anderen Typ als einfach int, so kann man nicht auf eine ungenannte Enum als Typ für etwas verwenden, müssen Sie einfach eine int akzeptieren und dann vergleiche mit der Konstante.

Etwas wie folgt aus:

void doSomething(int c); 

Versus etwas wie folgt aus:

void doSomething(cartoon c); 

By the way, würde Ihre Implementierung gleich sein, so im Falle von nicht namentlich Aufzählungen, der einzige wirkliche Nachteil ist stark tippen.

+0

Außer sie sind nicht eigentlich Konstanten, sie sind * konstante Ausdrücke *. Es gibt einen manchmal großen Unterschied. Beispielsweise können Sie eine Referenz oder Adresse auf eine Konstante anwenden. Das können Sie nicht mit Enum-Symbolen tun. –

4

enum, union, struct und class haben einen gemeinsamen Teil in der Syntax teilen die gleichen Dieses unamed Muster wird rarelly verwendet. Aber irgendwann können Sie das finden.

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

Oder wenn Sie eine einzelne Variable haben, die nur wenige Zustände enthält.

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

Dies vermeiden die folgende Deklaration.

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

Die zweite ist eine unbenannte enum. Ich kann nützlich sein, wenn Sie die Felder benötigen, aber Sie beabsichtigen nie, eine Variable dieses Aufzählungstyps zu deklarieren.

Um ein 'sehr C++' Beispiel seiner Verwendung zu bieten, werden Sie dies oft in Template-Metaprogrammierung sehen, wo die Enumeration als 'Kompilierzeit Rückgabewert' verwendet wird, ohne jemals eine Variable dieses Typs zu deklarieren:

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

Ist der '= 0;' -Teil eigentlich notwendig? –

+0

@Jacob Es ist nicht, aber es ist nur ein Beispiel (normalerweise hängt der Wert von 'res' von' T' ab) – icecrime

2

Ich biete nur ein reales Leben Beispiel Verwendung von anonymen Enum, die ich in einem eingebetteten Projekt begegnet. Im Projekt werden einige Parameter im EEPROM gespeichert. Nehmen wir an, dass diese Parameter das Alter des Kartencharakters sind, jeder Parameter hat die Größe von 1 Byte in kontinuierlicher Adresse.

Diese Parameter werden beim Einschalten des Prozessors in ein im ROM gespeichertes Array kopiert.

uint8_t ROM_AGE[END_AGE] 

Wenn wir definieren einen anomymous Enum hier:

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

Dann werden die Schlüsselwörter in Enum kann das Alter der einzelnen Zeichen wie ROM_AGE[HOMER_AGE] zu Index verwendet werden. Mit dieser Enumeration ist die Lesbarkeit viel besser als mit ROM_AGE[0].