Enums
In der Programmierung werden häufig Datentypen gebaucht, die einen fest definierten Wertebereich abdecken. Für diese sogenannten "integralen Datentypen" sind in C allerdings nur ganze Zahlen (Integer) und Gleitkommazahlen (floating point) definiert. Dies ist z.B. für das Speichern von Zuständen suboptimal. Ein einzelnes Byte deckt bereits 256 Zustände ab. Was wenn wir nur 4 abdecken möchten? Hinzu kommt, dass diese Zustände immer numerisch sind. Einen konkreten Namen für einen Wert lässt sich nicht definieren (außer über den Preprozessor).
Die Lösung für dieses Problem sind Aufzählungsdatentypen: Enums. Enums decken einen fest definierten Wertebereich ab, wobei jedem Zustand ein eindeutiger Name zugeordnet wird. Dies erlaubt es, eigene Datentypen mit angepassten Wertebereich zu definieren.
Enums sind Integer. Ein Enum wird intern immer als int abgebildet und ist daher auf die Größe eines int beschränkt. Da das aber selbst auf einem 16-Bit-System immer noch über 65.000 Zustände sind, ist diese Grenze in der Praxis kaum relevant. Lediglich bei Zuständen mit explizitem Wert ist auf die Grenze zu achten. Auch vom Alignment her entspricht ein Enum einem int.
Enums werden ähnlich wie Strukturen und Unions definiert. Hauptunterschied ist, dass die Zustände des Enums keinen Typ tragen. Sie bestehen nur aus einem global sichtbaren Namen und einem optionalen Wert.
#include <stdio.h>
enum myenum {
ONE = 0,
TWO = 200,
THREE = 42,
FOUR = 42,
};
void print_myenum(enum myenum e)
{
switch (e)
{
case ONE:
printf("ONE\n");
break;
case TWO:
printf("TWO\n");
break;
case THREE:
printf("THREE\n");
break;
}
}
int main()
{
enum myenum e1 = ONE;
enum myenum e2 = TWO;
print_myenum(e1);
print_myenum(e2);
print_myenum(THREE);
return 0;
}