Überschreiben Enumeration Basistyp pragma oder Codeänderung unter Verwendung von
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?
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.)