Frage

Gibt es eine Möglichkeit, in C ++ ein 64 -Bit -Enum zu haben? Während ich einen Code neu refaktierte, stieß ich auf eine Reihe von #Definen, die als Aufzählung besser wären, aber es fehlerhaft ist, dass der Compiler mehr als 32 Bit ist.

Aus irgendeinem Grund dachte ich, dass das Folgende funktionieren könnte:

enum MY_ENUM : unsigned __int64  
{  
    LARGE_VALUE = 0x1000000000000000,  
};
War es hilfreich?

Lösung

Ich denke nicht, dass das mit C ++ 98 möglich ist. Die zugrunde liegende Darstellung von Enums liegt beim Compiler. In diesem Fall sind Sie besser dran:

const __int64 LARGE_VALUE = 0x1000000000000000L;

Ab C ++ 11 ist es möglich, Enum -Klassen zu verwenden, um den Basistyp des Enum anzugeben:

enum class MY_ENUM : unsigned __int64 {
    LARGE_VALUE = 0x1000000000000000ULL
};

Zusätzlich führen Enum -Kurse einen neuen Namensumfang ein. Also anstatt sich auf zu beziehen LARGE_VALUE, Sie würden sich verweisen MY_ENUM::LARGE_VALUE.

Andere Tipps

C ++ 11 unterstützt dies unter Verwendung dieser Syntax:

enum class Enum2 : __int64 {Val1, Val2, val3};

Der aktuelle Entwurf von so genannten C ++ 0x, es ist N3092 sagt in 7.2 Aufzählungserklärungen, Absatz 6:

Es ist implementierungsdefiniert, welcher Integraltyp als zugrunde liegender Typ verwendet wird, mit der Ausnahme, dass der zugrunde liegende Typ nicht größer als int ist, es sei denn, der Wert eines Enumerators kann nicht in eine int oder nicht signierte int passen.

Der gleiche Absatz sagt auch:

Wenn kein integraler Typ alle Enumeratorwerte darstellen kann, ist die Aufzählung schlecht geformt.

Meine Interpretation des Teils Es sei denn ist, dass es durchaus gültig ist und sicher mit 64-Bit-Ganzzahlwert initialisiert wird, solange in einer bestimmten C ++-Implementierung 64-Bit-Ganzzahl-Typ bereitgestellt wird.

Zum Beispiel:

enum MyEnum
{
    Undefined = 0xffffffffffffffffULL
};

Die Antworten beziehen sich auf __int64 vermissen das Problem. Der Auflauf ist In allen C ++ - Compilern gültig, die einen echten 64 -Bit -Integraltyp haben, dh C ++ 11 Compiler oder C ++ 03 -Compiler mit entsprechenden Erweiterungen. Erweiterungen zu C ++ 03 mögen __int64 Arbeiten Sie unterschiedlich über Compiler hin, einschließlich der Eignung als Grundtyp für Enums.

Wenn der Compiler 64 -Bit -Enum nicht durch Kompilierungsflags oder andere bedeutet, gibt es meiner Meinung nach keine Lösung für diesen.

Sie könnten so etwas wie in Ihrem Beispiel erstellen wie:

namespace MyNamespace {
const uint64 LARGE_VALUE = 0x1000000000000000;
};

und es benutze es wie eine Aufzählung mit Verwendung

MyNamespace::LARGE_VALUE 

oder

using MyNamespace;
....
val = LARGE_VALUE;

Da Sie in C ++ arbeiten, könnte eine andere Alternative sein

const __int64 LARVE_VALUE = ...

Dies kann in einer H -Datei angegeben werden.

Ihr Code -Snipplet ist kein C ++ - Standard:

enum my_enum: unsigned __INT64

macht keinen Sinn.

Verwenden Sie stattdessen const __INT64, wie Torlack vorschlägt

Der Enum -Typ wird normalerweise durch den Datentyp des ersten Enum -Initialisierers bestimmt. Wenn der Wert den Bereich für diesen integralen Datentyp überschreiten sollte, stellt der C ++ - Compiler sicher, dass er durch die Verwendung eines größeren integralen Datentyps passt. Wenn Compiler feststellt, dass er keinem des integrierten Datentyps angehört, werfen Compiler Fehler. Ref: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1905.pdf
Bearbeiten: Dies hängt jedoch nur von der Maschinenarchitektur ab

Ein Enum in C ++ kann jeder integrale Typ sein. Sie können beispielsweise eine Aufzählung von Zeichen haben. Dh:

enum MY_ENUM
{
   CHAR_VALUE = 'c',
};

Ich würde davon ausgehen Dies schließt __INT64 ein. Versuche es einfach

enum MY_ENUM
{
   LARGE_VALUE = 0x1000000000000000,
};

Laut meinem Kommentator, Sixlettervariablen, ist der Basistyp in C immer ein int, während in C ++ der Basistyp das ist, was groß genug ist, um den größten Wert zu erreichen. Also sollten beide Aufzüge oben funktionieren.

In MSVC ++ können Sie dies tun:

enum mylglongenum: __ int64 {big_key = 0x3034303232303330, ...};

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top