type de base de recensement dominante en utilisant pragma ou de modification du code
Question
Problème:
J'utilise une grande base de code C / C ++ qui fonctionne sur compilateurs studio gcc et visuels où le type de base ENUM est par défaut 32 bits (type entier).
Ce code a aussi beaucoup de ligne + assemblage intégré qui traite ENUM comme type entier et les données ENUM est utilisé comme drapeaux 32 bits dans de nombreux cas.
Lorsque compilé ce code avec le compilateur ARM RealView de RVCT 2.2, nous avons commencé à obtenir de nombreux problèmes depuis compilateur RealView décide type de base ENUM automatiquement en fonction de la valeur d'un ENUM est réglé sur. http://www.keil.com/support/man/docs/ armccref / armccref_Babjddhe.htm
Par exemple,
Considérons le 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 optimise le type unsigned char pour cette ENUM.
En utilisant l'option du compilateur --enum_is_int n'est pas une bonne solution pour notre cas, car il convertit toutes les années ENUM à 32 bits qui cassera l'interaction avec un code externe compilé sans --enum_is_int.
Ceci est avertissement que je trouve dans les compilateurs de RVCT & Guide de la bibliothèque,
L'option --enum_is_int n'est pas recommandé pour un usage général et ne nécessaire pour la source ISO-compatible. Le code compilé avec cette option est conforme à l'ABI pour l'ARM Architecture (norme de base) [BsaBI], et l'utilisation incorrecte pourrait entraîner une l'échec à l'exécution. Cette option est soutenu par les bibliothèques C +.
Question
Comment convertir tout type de base de 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é le changement ci-dessus. Mais compilateur optimise cela aussi pour notre mauvaise chance. : (
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 de contrôler ce ENUM dans le compilateur ARM RVCT 2.2. Y at-il pragma caché disponible?
La solution
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
};
Autres conseils
C ++ 11:
enum class Scale : uint32_t {
TimesOne, //0
TimesTwo, //1
TimesFour, //2
TimesEight, //3
};
Visual Studio 2012 et 4.4.6 gcc avec le std = c ++ 0x l'option à la fois soutenir cette approche (versions antérieures peuvent aussi bien.)