2010-04-05 7 views

risposta

24

un'enumerazione è garantito di essere rappresentato da un numero intero, ma il tipo effettivo (e la sua signedness) dipende dall'implementazione.

È possibile forzare un'enumerazione di essere rappresentati da un tipo firmata dando uno degli enumeratori un valore negativo:

enum SignedEnum { a = -1 }; 

In C++ 0x, il tipo sottostante di un censimento può essere specificato esplicitamente:

enum ShortEnum : short { a }; 

(C++ 0x aggiunge anche il supporto per le enumerazioni con ambito)

per completezza, aggiungerò che in The C Programming Lingua, 2a ed., gli enumeratori sono specificati come aventi tipo int (p. 215). K & R non è lo standard C, quindi non è normativo per i compilatori ISO C, ma fa precedere lo standard ISO C, quindi è almeno interessante dal punto di vista storico.

+1

Quale firma viene effettivamente utilizzata da gcc? – osgx

+0

@osgx: Direi che dipenderà dal numero di enumeratori e dall'intervallo dei loro valori. Davvero non lo so. –

+2

Lo standard C specifica inoltre che ciascuna costante * di enumerazione * ha tipo 'int'. Howeve, il termine "costante di enumerazione" si riferisce alle costanti di valore dichiarate all'interno del blocco 'enum {}'. Una variabile con un tipo 'enum' può avere qualsiasi tipo intero in C, ad es. potrebbe essere un tipo più breve di 'int' se uno può rappresentare tutti i valori. (GCC, per esempio, ha un'opzione '-fshort-enums' per fare esattamente questo.) – Arkku

0

Questa è una vecchia questione ... ma ho appena scoperto questo:

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

Potete usarlo come un indice senza segno 2-bit, per esempio:

typedef struct { 
    ENUMNAME i:2; 
} STRUCTNAME; 

Provato in GCC ARM - non funziona.
Inoltre, WinDbg mostra STRUCTNAME.i come numero , non come v0-v3.