diversi motivi:
Motivo 1: Flessibilità:
enum lickahoctor { yes = 0, no = 1, maybe = 2 };
dichiara un'enumerazione. È possibile utilizzare i valori yes
, no
e maybe
ovunque e assegnarli a qualsiasi tipo integrale. È inoltre possibile utilizzare questo come un tipo, scrivendo
enum lickahoctor myVar = yes;
In questo modo è bello perché se una funzione accetta un parametro con il tipo enum lickahoctor saprete che è possibile assegnare yes
, no
o maybe
ad esso. Inoltre, il debugger saprà, quindi mostrerà il nome simbolico invece del valore numerico. Il problema è che il compilatore ti consente di assegnare solo i valori che hai definito in enum lickahoctor
a myVar
. Se per esempio vuoi definire alcuni flag nella classe base, quindi aggiungi altri flag nella sottoclasse, non puoi farlo in questo modo.
Se si utilizza invece un int, non si ha questo problema. Quindi vuoi usare una sorta di int, quindi puoi assegnare costanti arbitrarie.
Motivo 2: compatibilità binaria:
Il compilatore sceglie una bella dimensione che si adatta a tutte le costanti che avete definito in un enum. Non c'è alcuna garanzia di ciò che otterrai. Quindi se scrivi una struct contenente tale variabile direttamente in un file, non c'è alcuna garanzia che rimarrà della stessa dimensione quando la rileggi con la versione successiva della tua app (secondo lo standard C, almeno - - non è proprio così cupo nella pratica).
Se si utilizza un tipo di int invece, la piattaforma di solito garantisce una dimensione particolare per quel numero. Soprattutto se si utilizza uno dei tipi garantiti per una dimensione particolare, ad esempio int32_t
/uint32_t
.
Motivo 3: Leggibilità e di auto-documentazione
Quando si dichiara myVar sopra, è immediatamente evidente quali valori si può mettere in esso. Se usi semplicemente un int, o un uint32_t
, non lo è. Quindi, ciò che si fa è di utilizzare
enum { yes, no, maybe };
typedef uint32_t lickahoctor;
per definire un bel nome per il numero intero da qualche parte vicino le costanti che ricordano le persone che una variabile di questo tipo può contenere questo valore. Tuttavia, si ottiene comunque il vantaggio di una dimensione fissa prevedibile e la possibilità di definire valori aggiuntivi in sottoclassi, se necessario.
Motivo 4: Supporto per campi di bit
variabili enum tipizzato solo supporto assegnando esattamente un valore dai loro opzioni. Quindi, se stai cercando di implementare un campo bit, non puoi inserirlo come bitfield. Inoltre, è necessario utilizzare variabili non firmate per evitare che l'estensione del segno ti rovini.
typedef e enum sono molto diversi ... Non capisco davvero la tua domanda? enumerazioni vengono utilizzate per impostare raccolte di costanti di numeri interi con nome. typedef sono usati per dare un tipo di dati un nuovo nome, spesso per supportare architetture diverse ... – t00ny