2010-03-26 2 views
1

Problème:type de base de l'énumération prioritaire en utilisant pragma ou changement de code

J'utilise une grande base de code C/C++ qui fonctionne sur compilateurs visual studio gcc & où le type de base de ENUM est par défaut 32 bits (nombre entier type).

Ce code a également beaucoup d'assemblage incorporé + incorporé qui traite l'énumération comme un type entier et les données d'énumération sont utilisées comme des indicateurs de 32 bits dans de nombreux cas. Lors de la compilation de ce code avec le compilateur Realview ARM RVCT 2.2, nous avons commencé à rencontrer de nombreux problèmes car le compilateur realview décide automatiquement du type de base enum en fonction de la valeur définie par enum. http://www.keil.com/support/man/docs/armccref/armccref_Babjddhe.htm

Par exemple,

Tenir compte du dessous ENUM,

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

Ce ENUM est utilisé comme un drapeau de 32 bits. mais le compilateur l'optimise pour le type char non signé pour cette énumération. L'utilisation de l'option --enum_is_int du compilateur n'est pas une bonne solution dans notre cas, car elle convertit toutes les enum en 32 bits, ce qui rompra l'interaction avec tout code externe compilé sans --enum_is_int.

C'est un avertissement que j'ai trouvé dans compilateurs RVCT & Guide de la bibliothèque,

L'option --enum_is_int n'est pas recommandé pour un usage général et n'est pas nécessaire pour la source ISO-compatible. Le code compilé avec cette option n'est pas conforme à l'ABI pour l'architecture ARM (norme de base) [BSABI], et une utilisation incorrecte peut entraîner une défaillance lors de l'exécution. Cette option n'est pas prise en charge par les bibliothèques C++.

Question

Comment convertir le type de base de tous ENUM (par des changements codés à la main) à utiliser 32 bits sans affecter la commande de valeur?

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

J'ai essayé la modification ci-dessus. Mais le compilateur optimise cela aussi pour notre malchance. :(

Il y a une certaine syntaxe dans .NET comme

ENUM Echelle: int

Est-ce un compilateur standard et ARM ISO C++ en manque

Il n'y a pas #? pragma pour contrôler cette énumération dans le compilateur ARM RVCT 2.2 Existe-t-il un pragma caché?

Répondre

4

Je sais que beaucoup des fenêtres en-têtes utilisent les éléments suivants:

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

Qu'est-ce que cet en-tête Windows? – vprajan

+0

Certains en-têtes Windows utilisent cette technique: 'd3d10shader.h',' d2d1.h', et ' wincodec.h' –

0

En C de 11:

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

Visual Studio 2012 et gcc 4.4.6 avec le std = L'option C++ 0x prend en charge cette option (les versions antérieures peuvent également l'être.)

Questions connexes