Enum
-
Mal eine kleine Frage, kann es sein, dass Enum kein Datentyp ist? Ich dächte, dass es sich um unsigned int handelt.
Diese Zeilen geben nämlich sehr viele Fehler:
typedef enum Xenum; Xenum Colors { RED 0 GREEN 1 BLUE 2 };
-
enum ist ein schlüsselwort, kein typ. ganz ähnlich wie union, struct und class keine typen sondern schlüsselworte sind.
-
Tc++H schrieb:
Mal eine kleine Frage, kann es sein, dass Enum kein Datentyp ist? Ich dächte, dass es sich um unsigned int handelt.
Diese Zeilen geben nämlich sehr viele Fehler:
typedef enum Xenum; Xenum Colors { RED 0 GREEN 1 BLUE 2 };
du hast es falsch geschrieben. so geht's z.b.
typedef enum Colors { RED = 0, GREEN = 1, BLUE = 2, } Xenum;
enums sind meistens sowas wie 'int' oder 'unsigned int', also ganz gewöhnliche zahlenwerte
-
net schrieb:
enums sind meistens sowas wie 'int' oder 'unsigned int', also ganz gewöhnliche zahlenwerte
Man kann übrgens auch dafür sorgen, das sie nur einen bestimmten Datentyp 'einnehmen':
Beispiel:
#include <climits> typedef enum Colors // unsigned int enum { RED = 0, GREEN = 1, BLUE = 2, ENSURE_MAX_UINT_ENUM = MAX_UINT } Xenum;
-
@CodeFinder: nö
#include <iostream> #include <climits> using namespace std; enum enum_char { foo_1 = CHAR_MAX }; enum enum_uchar { foo_2 = UCHAR_MAX }; enum enum_short { foo_3 = SHRT_MAX }; enum enum_ushort { foo_4 = USHRT_MAX }; enum enum_int { foo_5 = INT_MAX }; enum enum_uint { foo_6 = UINT_MAX }; enum enum_long { foo_7 = LONG_MAX }; enum enum_ulong { foo_8 = ULONG_MAX }; enum enum_longlong { foo_9 = 0xffffffffffffffff }; int main( ) { cout << "Enum enum_char benutzt " << sizeof( enum_char ) << " bytes." << endl; cout << "Enum enum_uchar benutzt " << sizeof( enum_uchar ) << " bytes." << endl; cout << "Enum enum_short benutzt " << sizeof( enum_short ) << " bytes." << endl; cout << "Enum enum_ushort benutzt " << sizeof( enum_ushort ) << " bytes." << endl; cout << "Enum enum_int benutzt " << sizeof( enum_int ) << " bytes." << endl; cout << "Enum enum_uint benutzt " << sizeof( enum_uint ) << " bytes." << endl; cout << "Enum enum_long benutzt " << sizeof( enum_long ) << " bytes." << endl; cout << "Enum enum_ulong benutzt " << sizeof( enum_ulong ) << " bytes." << endl << endl; cout << "Jeder einem Enumerator zugewiesene wert wird auf " << hex << foo_9 << " verkürzt." << endl; }
Ausgabe:
Enum enum_char benutzt 4 bytes. Enum enum_uchar benutzt 4 bytes. Enum enum_short benutzt 4 bytes. Enum enum_ushort benutzt 4 bytes. Enum enum_int benutzt 4 bytes. Enum enum_uint benutzt 4 bytes. Enum enum_long benutzt 4 bytes. Enum enum_ulong benutzt 4 bytes. Jeder einem Enumerator zugewiesene wert wird auf ffffffff verkürzt.
Meint auf jedenfall mein MSVC 2003 .net.
Greetz, Swordfish
-
Nunja...ich habs nit genau getestet...hab mir das bei den FMOD enums abgeguckt...wunder tmich nur das FMOD scheiße gebaut hat...oder es war für was total anderes
...egal aber hast recht kommt immer 4 raus :p
-
@CodeFinder:
Da hat niemand misstgebaut. Es ist nur schließlich und endlich so, dass es dem Gutdünken des Compilers überlassen bleibt, Welchen Typ er auswählt. Der Standard meint nur, daß der Compiler minimal 1023 Enumeratoren in einem enum zulassen sollte (somit fällt char bzw. unsigned char weg) und es ein unsigned int sein sollte. Falls der größte Wert jedoch den Wertebereich von unsigned int überschreitet, darf es auch etwas größeres sein. Man sieht halt, das sich der MSVC 7.1 in diesem Falle:enum enum_longlong { foo_9 = 0xffffffffffffffff };
nicht an den Standard hält und auf 0xffffffff ( UINT_MAX ) verkürzt. Ansonsten kann der Compiler je nach Anzahl der Enumeratoren bzw. des höchsten wertes selbst entscheiden, welchen Typ er nimmt.
Greetz, Swordfish
-
hm ok, dann ist aber schlicht weg überflüssig
-
@CodeFinder: Versteh' dich nicht.
Greetz, Swordfish
-
Mich hatte es nur gewundert, da ich irgendwo mal im Internbet gelesen hatte, dass enum mit long bzw. unsigned long zu vergleichen wäre.
-
Tc++H schrieb:
Mich hatte es nur gewundert, da ich irgendwo mal im Internbet gelesen hatte, dass enum mit long bzw. unsigned long zu vergleichen wäre.
da ist ein wenig vorsicht angesagt, denn es gibt hier unterschiede zwischen C und C++. in C (jedenfalls in C99: 6.7.2.2/2) muss der wert einer aufzählungskonstante in ein int passen (und in diesem licht betrachtet, kann man verstehen, wo die obige verkürzung herkommt). in C++ ist das nicht so.
-
ISO/IEC 14882, 7.2/5 schrieb:
The underlying type of an enumeration is an integral type that can represent all the enumerator values defined in the enumeration. It is implementation-defined which integral type is used as the underlying type for an enumeration except that the underlying type shall not be larger than int unless the value of an enumerator cannot fit in an int or unsigned int. [...]
Demnach würd' ich davon ausgehen, dass die Verkürzung von
enum enum_longlong { foo_9 = 0xffffffffffffffff };
auf 0xffffffff ( UINT_MAX ) nicht standardgemäß ist.
Greetz, Swordfish
-
Swordfish schrieb:
@CodeFinder: Versteh' dich nicht.
Greetz, Swordfish
...
#include <climits> typedef enum Colors { RED = 0, GREEN = 1, BLUE = 2, ENSURE_MAX_UINT_ENUM = MAX_UINT // überflüssg ;) } Xenum;