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é?
Qu'est-ce que cet en-tête Windows? – vprajan
Certains en-têtes Windows utilisent cette technique: 'd3d10shader.h',' d2d1.h', et ' wincodec.h' –