2010-04-05 3 views

Répondre

24

Un enum est assuré d'être représenté par un nombre entier, mais le type réel (et son signedness) est dépendant de l'implémentation.

Vous pouvez forcer une énumération à être représenté par un type signé en donnant l'un des agents recenseurs une valeur négative:

enum SignedEnum { a = -1 }; 

En C++ 0x, le type sous-jacent d'une énumération peut être explicitement spécifié:

enum ShortEnum : short { a }; 

(C++ 0x ajoute également le support pour les énumérations scope)

pour être complet, je vais ajouter que dans la programmation C Langue, 2e éd., les énumérateurs sont spécifiés comme ayant le type int (page 215). K & R n'est pas le standard C, donc ce n'est pas normatif pour les compilateurs ISO C, mais il est antérieur à la norme ISO C, donc c'est au moins intéressant d'un point de vue historique.

+1

Quelle signature est réellement utilisée par gcc? – osgx

+0

@osgx: Je suppose que cela dépend du nombre d'énumérateurs et de la plage de leurs valeurs. Je ne sais vraiment pas. –

+2

La norme C spécifie également que chaque * constante d'énumération * a le type «int». Cependant, le terme "constante d'énumération" fait référence aux constantes de valeur déclarées à l'intérieur du bloc "enum {}". Une variable avec un type 'enum' peut avoir n'importe quel type entier en C, par ex. il pourrait être un type plus court que 'int' si l'on peut représenter toutes les valeurs. (GCC, par exemple, a l'option '-fshort-enums' pour faire cela exactement.) – Arkku

0

Ceci est une vieille question ... mais je viens de trouver ce:

typedef unsigned ENUMNAME; // this makes it unsigned in MSVC C 2015 
typedef enum {v0, v1, v2, v3} ENUMNAME; 

Vous pouvez l'utiliser comme un index non signé 2 bits, par exemple:

typedef struct { 
    ENUMNAME i:2; 
} STRUCTNAME; 

Je l'ai essayé dans GCC ARM - ne fonctionne pas.
En outre, WinDbg affiche STRUCTNAME.i comme numéro, pas comme v0-v3.

Questions connexes