Le type enum
est-il signé ou non signé? La signature des enums diffère-t-elle en C/C99/ANSI C/C++/C++ x/GNU C/GNU C99?Signalisation de l'énumération en C/C99/C++/C++ x/GNU C/GNU C99
Merci
Le type enum
est-il signé ou non signé? La signature des enums diffère-t-elle en C/C99/ANSI C/C++/C++ x/GNU C/GNU C99?Signalisation de l'énumération en C/C99/C++/C++ x/GNU C/GNU C99
Merci
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.
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.
Quelle signature est réellement utilisée par gcc? – osgx
@osgx: Je suppose que cela dépend du nombre d'énumérateurs et de la plage de leurs valeurs. Je ne sais vraiment pas. –
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