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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top