2013-04-15 18 views
11
  • un enum è un "nome raggruppamento di costanti": enum MyType_e {A, B, C};
  • Queste costanti sono dichiarate nel campo di applicazione principale della enum cioè se l'enumerazione viene dichiarata in ambito di file, ed è senza nome, è equivalente a una serie di es #define A 0 dichiarazioni
  • Il tipo sottostante per le costanti enum è sempre int cioè int var = A è completamente legale, anche se var non è di tipo MyType_e

Allora cosa serve il nome enum servono?A cosa serve il nome enum?

EDIT Come per i commenti qui sotto, la mia comprensione di enumerazioni sembra essere abbastanza viziata. Un enum non ha nulla a che fare con le istruzioni #define.Enums are resolved at compile time e sono stati digitati.

+1

Puoi indicare sezioni dello standard C da cui ricevi queste idee? C non ha spazi dei nomi (almeno nel senso che penso che tu ti stia riferendo a qui), e nemmeno il tipo sottostante per enum sempre int. O è questo da un nuovo standard C? –

+2

@Anonimo: 6.7.2.2/3 dello standard C99 dice "Gli identificatori in una lista di elenchi sono dichiarati come costanti che hanno tipo' int' ... ". Questo è un po 'di confusione, tuttavia, poiché in seguito continua a dire: "Ogni tipo enumerato deve essere compatibile con' char', un tipo intero con segno o un tipo intero senza segno.La scelta del tipo è definita dall'implementazione ... . "Quindi le costanti stesse sono' int', ma il tipo 'enum' stesso potrebbe non esserlo. Per "namespace", penso che Vorac significasse "scope". – jamesdlin

+0

@jamesdlin, Anonimo: ho modificato la domanda in modo che fosse meno corretta. Il tipo dipendente dall'implementazione per le enumerazioni è una novità per me. Abbastanza interessante. – Vorac

risposta

6

Utilizzo del tipo enum intento.

Supponiamo di avere una funzione che accetta una costante enum come argomento.

void foo(enum MyType_e e); 

è auto-documentazione su ciò che gli ingressi sono validi, ma:

void foo(int e); 

non è. Inoltre, il compilatore può emettere avvisi se si tenta di trasmettere valori incompatibili per il tipo enum. Dall'allegato I ("Avvertenze comuni") della specifica ISO C99:

Un'implementazione può generare avvisi in molte situazioni .... Le seguenti sono alcune delle situazioni più comuni.

[...]

  • Un valore è dato a un oggetto di un tipo di enumerazione diverso ottenuto assegnando una costante di enumerazione che è un membro di quel tipo, o una variabile di enumerazione che ha lo stesso digita, o il valore di una funzione che restituisce lo stesso tipo di enumerazione (6.7.2.2).

Alcuni compilatori (ad esempio, gcc) potrebbero anche generare avvisi se si utilizza switch su un tipo di enum ma trascurano di gestire tutte le sue costanti e non hanno un caso default.

2

Mentre si può dire perfettamente

int var = A 

la variante

enum mytype var = A 

è meglio per motivi documentatory.

+1

Come assegnare 1 a 'var' che è dichiarato' enum mytype var' o passa a 1 quando il parametro della funzione è di tipo 'enum mytype'? –

+0

@AlexeyFrunze Niente ti impedisce di farlo. – glglgl

+0

Si potrebbe ottenere almeno un avvertimento utile. –

1

Le risposte di cui sopra sono buone e corrette, voglio solo aggiungere che alcuni debugger, sono in grado di mostrare il nome enum quando si posiziona o si eleva una variabile di tipo enum.Ciò aiuta davvero la chiarezza, specialmente quando le enumerazioni vengono utilizzate per gli stati nell'implementazione della macchina di stato.