2009-03-29 16 views
11

Kompilieren mit gcc C99typedef enum, Zuweisung eines Wertes innerhalb

Ich verwende enums schon seit einer Weile. Ich verwende jedoch einen Beispielcode, um meine Anwendung zu entwickeln. Und ich bin auf einen Code wie diesen gestoßen. Ich wurde darüber informiert, dass dies die beste Vorgehensweise bei der Verwendung von Enums ist. Aber ich sehe nicht, wie das Vorteile hat.

typedef enum { 
    TYPE_DATE, 
    TYPE_TIME, 
    TYPE_MONEY, 

    TYPE_COUNT, 
    TYPE_UNKNOWN = TYPE_COUNT 
} string_type_e; 

Warum haben die TYPE_COUNT und warum TYPE_COUNT-TYPE_UNKNOWN zuweisen?

Vielen Dank für Ihre Anregungen,

Antwort

17

Standardmäßig erhalten Enums automatisch Ganzzahlen beginnend mit 0 vom Compiler. Also Datum wird Null, Zeit eins und Geld zwei. Der nächste Wert wird dem 'psuedo' Enum-Wert TYPE_COUNT zugewiesen, der den Wert drei erhalten wird, was zufällig die Anzahl der 'richtigen' Enum-Werte ist.

TYPE_UNKNOWN ist ein anderer Wert, der etwas darstellt, das kein "richtiger" Wert ist, also einen Test e < TYPE_COUNT nicht bestehen wird. Wenn es gleich TYPE_COUNT ist, bedeutet das, dass jeder einzelne bedeutungsvolle Wert zusammenhängend ist, aber mir ist kein signifikanter Vorteil bekannt (es gäbe, wenn TYPE_COUNT eins weniger als eine Potenz von 2 wäre, was die Darstellung des Compilers beeinflussen könnte) und sein ‚nett‘ zusammenhängenden um die Werte zu haben, aber es ist nicht wirklich wichtig, wie Sie sie vorbei TYPE_COUNT sowieso nicht erhöhen würden)

+0

Kann ich den benannten Konstanten in einer Aufzählung Werte wie 0x2 und 0xfffe zuweisen? – Namratha

+1

@Namratha können Sie, und es ist ziemlich häufig, wo ihre ist ein Protokoll, wo die Werte als Teil der Schnittstelle mit einer anderen Komponente festgelegt sind.In solchen Fällen würden Sie wahrscheinlich am Ende nicht so etwas wie 'TYPE_COUNT' verwenden, denn wenn die Werte nicht zusammenhängend sind, werden Sie nicht über sie zählen. –

6

Enum-Werte sind grundsätzlich ganzzahlige Konstanten. Standardmäßig erhalten sie den Wert des letzten Elements in der Enumeration + 1 (und 0 für das erste Element). Wenn Sie die Elemente, die für die Zuordnung mit einem Array oder etwas ähnlichem nützlich sein könnten, zählen (die dynamisch aktualisiert werden, wenn Sie etwas hinzufügen oder entfernen), können Sie COUNT konstant auf setzen das Ende davon (TYPE_COUNT in Ihrem Beispiel). Um ungültige Werte in der Enumeration unterscheiden zu können, möchten Sie möglicherweise eine andere Konstante deklarieren. In Ihrem Beispiel entspricht diese Konstante der Zählkonstanten, die um einen Wert größer als der größte Wert Ihrer Enumeration ist.

3

Warum haben die type_count und warum type_count zu type_unknown zuweisen?

Um einen Tab auf den maximal zulässigen Wert für eine enum zu halten. Denken Sie daran, es gäbe sonst keine Möglichkeit zu überprüfen, ob ein bestimmter Wert korrekt ist (innerhalb des Bereichs) oder nicht.

+0

Aber es kann Lücken und Überlappungen im Bereich eines Enums geben - im Beispiel natürlich nicht, im Allgemeinen aber in enums. –

+0

@ Jonathan: Wenn der Autor ein Enum mit Lücken in der zugrunde liegenden Sequenz entwerfen würde, wäre diese Methode der Definition einer Zählkonstante nutzlos. Ein Autor, der sich für letzteres interessiert, würde das erste vermeiden - so einfach. – Shog9

2

TYPE_COUNT dienen kann ein Array von den Elementen des enum indiziert zu dimensionieren:

type_info my_info[TYPE_COUNT]; 

oder kann in einem Ausgangszustand einer for-Schleife verwendet werden. TYPE_UNKNOWN kann verwendet werden, um einen ungültigen oder undefinierten Wert für den Typ darzustellen (-1 könnte eine Alternative zu TYPE_COUNT für seinen Wert sein).