Wie ändere ich den von einer Enumeration (C++) verwendeten Integer-Typ?

Lesezeit: 3 Minuten

Benutzer-Avatar
Linuxios

Wenn ich eine C++-Aufzählung habe:

enum Foo
{
  Bar,
  Baz,
  Bork,
};

Wie sage ich dem Compiler, dass er a verwenden soll? uint16_t um den Wert der Aufzählung tatsächlich zu speichern?

BEARBEITEN: Unterstützt GCC diese Funktion in seiner Implementierung von C++11?

  • @YochaiTimmer, Standard geändert und Thema auf dem Link sagt nichts aus enum class

    – Lol4t0

    24. März 2012 um 17:10 Uhr

  • @YochaiTimmer: Überhaupt nicht. Ich möchte wissen, ob ich enum ändern kann, um seine Werte intern mit a zu speichern uint16_tnicht ob es die gleiche Größe hat wie int.

    – Linuxios

    24. März 2012 um 17:14 Uhr

Benutzer-Avatar
Nicol Bola

Dies ist in C++98/03 nicht möglich. C ++ 11 erlaubt Ihnen, dies zu tun, und ohne enum class die Art, wie alle anderen dir immer wieder sagen:

enum EnumType : uint16_t
{
  Bar,
  Baz,
  Bork,
};

Auch hier müssen Sie nicht verwenden enum class. Nicht, dass es eine schlechte Idee wäre, aber Sie tun es nicht haben zu.


Unterstützt GCC diese Funktion in seiner Implementierung von C++11?

Welche GCC-Version? Es sieht so aus, als hätte GCC 4.4 diese Funktionalität hinzugefügt, aber Sie sollten wahrscheinlich nach neueren Versionen suchen, nur um der Stabilität willen.

  • Das habe ich mich auch schon gefragt. Der einzige Unterschied ist das enum class schafft einen neuen Geltungsbereich, wohingegen enum nicht.

    – Chris

    24. März 2012 um 17:26 Uhr

  • @chris: Nein, es gibt mehrere Unterschiede zwischen enum class und enum. Beide erstellen Bereiche (die obige Bar kann mit zugegriffen werden EnumType::Bar), sondern nur die class Ausführung Kräfte Sie die bereichsbezogene Aufzählung verwenden. Ebenfalls, enum class Variablen nicht implizit ganze Zahlen in den Aufzählungstyp umwandeln. Sie müssen also entweder einen tatsächlichen Enumerator des richtigen Typs übergeben oder eine explizite Umwandlung durchführen. Dies fügt ein viel mehr Typensicherheit.

    – Nicol Bolas

    24. März 2012 um 17:30 Uhr


  • Oh, ich habe meinen Standpunkt aus einer anderen Frage zu SO verstanden: stackoverflow.com/questions/441552/… Was Ihren zweiten Punkt betrifft, habe ich einfach noch nie davon gehört. Danke für das kostenlose Wissen 🙂

    – Chris

    24. März 2012 um 17:46 Uhr

Benutzer-Avatar
Nawaz

In C++11 können Sie das tun:

enum class Foo : uint16_t 
{
  Bar,
  Baz,
  Bork,
};

Später können Sie auch den zugrunde liegenden Typ der Aufzählung kennen als:

#include <type_traits> 

std::underlying_type<Foo>::type v = 10; //v is uint16_t

Mit c++11 hast du jetzt enum classmit dem Sie den zugrunde liegenden Typ explizit festlegen können:

enum class Foo: uint16_t 
{ 
   Bar,
   Baz,
   Bork,
}; 

Benutzer-Avatar
Dietmar Kühl

Mit Pre-C++2011 können Sie einen Mindestspeicher erzwingen, indem Sie einen geeigneten Wertebereich verwenden:

enum foo {
    v0 = 0,
    vmax = 32767
};

Ich denke, der Compiler kann entweder ein Zeichen oder einen vorzeichenlosen Integer-Typ als zugrunde liegenden Typ auswählen. Der obige Bereich erzwingt, dass die Darstellung mindestens verwendet short als zugrunde liegende ganze Zahl. Wenn Sie es noch eins größer machen, kann es dazu führen, dass es verwendet wird long stattdessen. Dies erzwingt natürlich nur einen minimalen Bereich und der Compiler kann einen größeren Bereich frei wählen. Mit der obigen Definition dürfen Sie sich auch nicht außerhalb des Bereichs bewegen [0, 32767]: Wenn Sie wirklich (mindestens) einen 16-Bit-Bereich benötigen, müssen Sie entsprechende Werte verwenden).

1385940cookie-checkWie ändere ich den von einer Enumeration (C++) verwendeten Integer-Typ?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy