Firma di enum in c/c99/c ++/c ++ x/gnu c/gnu c99
Domanda
È enum
tipo firmato o non firmato? La firma degli enum differisce in c/c99/ansi c/c ++/c ++ x/gnu c/gnu c99?
Grazie
Soluzione
È garantito che un ENUM sia rappresentato da un numero intero, ma il tipo effettivo (e la sua firma) dipende dall'implementazione.
È possibile forzare un enumerazione ad essere rappresentato da un tipo firmato dando a uno degli enumeratori un valore negativo:
enum SignedEnum { a = -1 };
In C ++ 0x, il tipo di enumerazione sottostante può essere esplicitamente specificato:
enum ShortEnum : short { a };
(C ++ 0x aggiunge anche supporto per enumerazioni con ambito)
Per completezza, lo aggiungerò in Il linguaggio di programmazione C, 2a ed., gli enumeratori sono specificati come un tipo int
(p. 215). K&R non è lo standard C, quindi non è normativo per i compilatori ISO C, ma precede lo standard ISO C, quindi è almeno interessante dal punto di vista storico.
Altri suggerimenti
Questa è una vecchia domanda ... ma ho appena scoperto questo:
typedef unsigned ENUMNAME; // this makes it unsigned in MSVC C 2015
typedef enum {v0, v1, v2, v3} ENUMNAME;
Puoi usarlo come indice non firmato a 2 bit, ad esempio:
typedef struct {
ENUMNAME i:2;
} STRUCTNAME;
Ho provato nel braccio GCC: non funziona.
Inoltre, windbg mostra structname.i come a numero, non come V0-V3.