Für einen übereinstimmenden Compiler ist eine Aufzählungskonstante immer vom Typ int
(äquivalent signed int
). Aber solche Konstanten werden normalerweise nicht im Speicher gespeichert, so dass ihr Typ wahrscheinlich keinen großen Einfluss auf die Speicheranforderungen hat.
Ein deklariertes Objekt des Aufzählungstyps ist vom Aufzählungstyp selbst, der mit char
oder mit einem Vorzeichen vom Typ mit oder ohne Vorzeichen kompatibel ist. Die Wahl des Typs ist implementationsdefiniert (d. H. Der Compiler wird wählen müssen, aber er muss dokumentieren, wie er die Wahl trifft); Die einzige Voraussetzung ist, dass der Typ in der Lage sein muss, die Werte aller Konstanten zu speichern.
Es ist zugegebenermaßen seltsam, dass die Konstanten vom Typ int
und nicht vom Aufzählungstyp sind, aber so ist die Sprache definiert (die Gründe sind historisch und C++ hat andere Regeln).
Zum Beispiel gegeben:
enum foo { x, y, z };
enum foo obj;
obj = z;
der Ausdruck z
vom Typ int
und hat den Wert 2 (ebenso wie der Dezimalkonstante 2
), sondern das Objekt obj
ist vom Typ enum foo
und kann so klein sein, als ein Byte, abhängig vom Compiler. Die Zuweisung obj = z;
beinhaltet eine implizite Konvertierung von int
zu enum foo
(diese Konvertierung kann zusätzlichen Code erfordern oder nicht erfordern).
Einige Compiler bieten möglicherweise eine nicht standardmäßige Möglichkeit, den für einen Aufzählungstyp zu wählenden Typ anzugeben. Einige können sogar den Standard in irgendeiner Weise verletzen. Sehen Sie in der Dokumentation Ihres Compilers nach, drucken Sie den Wert sizeof (enum foo)
aus und untersuchen Sie gegebenenfalls den generierten Code.
Es ist wahrscheinlich, dass Ihr Compiler innerhalb der von der Sprache vorgegebenen Einschränkungen vernünftige Entscheidungen treffen wird. Für einen Compiler, der auf speicherarme eingebettete Systeme ausgerichtet ist, ist es besonders wahrscheinlich, dass der Compiler entweder einen kleinen Typ auswählt oder Sie einen angeben lässt. Konsultieren Sie die Dokumentation Ihres Compilers.
Wie Ians Antwort darauf hinweist, können Sie, wenn Sie die Speichernutzung selbst steuern möchten, char
oder unsigned char
Objekte verwenden. Sie können jedoch weiterhin eine enum
Definition verwenden, um die Konstanten zu definieren. Zum Beispiel:
enum { x, y, z }; // No tag, so you can't declare objects of this type
typedef unsigned char foo; // an enum_foo object is guaranteed to be 1 byte
foo obj = z;
Verweis: Abschnitt 6.7.2.2 der C standard. Der Link ist zu einem 1,7-Megabyte-PDF eines kürzlich veröffentlichten Entwurfs des ISO-C-Standards 2011; Dieser spezielle Abschnitt hat sich seit 1989 nicht wesentlich verändert.
Vielen Dank, ich hatte nicht das Handbuch handlich – Flot2011
@ Flot2011: Wirklich !? Das ist das Internet; Das Handbuch ist immer praktisch! [* Ich * habe es heruntergeladen] (http://www.iar.com/en/Products/IAR-Embedded-Workbench/ARM/User-guides/). Ich habe nicht den Compiler, aber ich würde mir vorstellen, nachdem ich andere IAR-Produkte in der Vergangenheit verwendet habe, dass das Handbuch lokal installiert wird, wenn Sie die IDE installieren, und über das Hilfe-Menü in der einen oder anderen verfügbar ist (Hilfe oder PDF). – Clifford
: OK, also willst du trotzdem eine Erklärung. Hier geht es: Ich arbeite überhaupt nicht mit diesem Compiler, ich arbeite mit VS2003 und mein Code wird später auf dem Client-Rechner neu kompiliert, weil der Client keine Lizenz für mich kaufen will :-(Ich hatte ein Test, der abgelaufen war und ich ihn deinstalliert habe Da ich nicht sicher war, welche Version des IAR der Client letztendlich verwenden wird, habe ich gedacht, dass ich besser eine allgemeine Frage stellen werde, aber eigentlich hast du recht, ich war hier ein bisschen faul Danke für die Antwort – Flot2011