Frage

Problem:

Ich bin mit einer großen C / C ++ Code-Basis, die auf gcc funktioniert & Visual Studio Compiler wo Enum Basistyp ist standardmäßig 32-Bit (Typ Integer).

Dieser Code hat auch viele Inline + eingebettete Anordnung, die behandelt Enum als Integer-Typ und Enum-Daten werden als 32-Bit-Flags in vielen Fällen verwendet.

Wenn Sie diesen Code kompiliert mit ARM Realview RVCT 2.2 Compiler haben wir begonnen, viele Probleme bekommen, da Realview-Compiler Typ Enum Basis entscheidet automatisch, basierend auf dem Wert eine Enumeration eingestellt ist. http://www.keil.com/support/man/docs/ armccref / armccref_Babjddhe.htm

Beispiel:

die unter Enum Betrachten

enum Scale {
    TimesOne, //0
    TimesTwo, //1
    TimesFour, //2
    TimesEight, //3
};

Dieses Enum wird als 32-Bit-Flag verwendet. aber Compiler optimiert es unsigned char-Typ für diese Enumeration.

Option --enum_is_int Compiler verwenden, ist keine gute Lösung für unseren Fall, da es alle wandelt die Enum auf 32-Bit ist die Interaktion mit einem externen Code ohne --enum_is_int zusammengestellt brechen wird.

Dieses warnt ich fand in RVCT Compiler & Library Guide,

  

Die --enum_is_int Option ist nicht   für den allgemeinen Gebrauch empfohlen und ist nicht   für ISO-kompatible Quelle erforderlich.   Code mit dieser Option kompiliert ist nicht   mit der ABI-konform für die ARM   Architektur (Basis-Standard) [BsaBI],   und falsche Anwendung kann in eine Folge   Versagen zur Laufzeit. Diese Option ist nicht   unterstützt durch die C ++ Bibliotheken.

Frage

Wie alle Basistyp des Enum umwandeln (von Hand codierten Änderungen) 32-Bit zu verwenden, ohne Wert Ordnung zu beeinträchtigen?

enum Scale {
    TimesOne=0x00000000,
    TimesTwo, // 0x00000001
    TimesFour, // 0x00000002
    TimesEight, //0x00000003
};

habe ich versucht, die obige Änderung. Aber Compiler optimiert dies auch für unser Pech. : (

Es gibt einige Syntax in .NET wie

  

Enum Maßstab: int

Ist das ein ++ ISO-C-Standard und ARM Compiler es fehlt?

Es gibt keine Pragma dieses Enum in ARM RVCT 2.2 Compiler zu steuern. Gibt es eine versteckte Pragma verfügbar?

War es hilfreich?

Lösung

Ich weiß, dass viele der Fenster-Header verwenden Sie die folgende:

enum SOME_ENUM {
    ONE = 1,
    TWO = 2,
    //...
    FORCE_DWORD = 0x7FFFFFFF
};

Andere Tipps

In C ++ 11:

enum class Scale : uint32_t {
   TimesOne, //0
   TimesTwo, //1
   TimesFour, //2
   TimesEight, //3
};

Visual Studio 2012 und gcc 4.4.6 mit der -std = c ++ 0x Option beide unterstützen diese (früheren Versionen kann auch.)

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