type de base de recensement dominante en utilisant pragma ou de modification du code

StackOverflow https://stackoverflow.com/questions/2521200

  •  22-09-2019
  •  | 
  •  

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?

Était-ce utile?

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.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top