2011-09-15 9 views
7

Il testo che segue è un estratto dal C Programming Language, 2nd Edition, scritto dal creatore del linguaggio C (quindi presumo che sia corretta):Perché un enumerato non viene controllato dal compilatore C?

Anche se le variabili di tipo enum possono essere dichiarati, i compilatori non ha bisogno di controllare che ciò che memorizzi in tale variabile è un valore valido per l'enumerazione.

ho qualche dubbio:

  1. Per quali casi nel linguaggio C non fa il compilatore a controllare il valore di un enum?
  2. enum le costanti non vengono controllate per qualche motivo. Perchè no? Quali sono le ragioni?
  3. Poiché enum non è controllato dal compilatore, utilizza enum soggetto a errori? Spiega per favore.
+0

un voto vicino perché? –

+1

Qualcuno ha pensato che si trattasse di un duplicato di/questions/432937/net-why-arent-enums-range-value-checked. Probabilmente hanno cambiato idea (la risposta è la stessa, ma la domanda riguarda una lingua diversa dopotutto), ma non è possibile rimuovere un voto ravvicinato. –

risposta

8
  1. Un'enumerazione è come un intero fantasia, ed è meglio che definire un intero carico di costanti o macro del preprocessore come nomi per i valori costanti si desidera memorizzare, perché un compilatore (o editore) può verifica di utilizzare i nomi e i valori corretti per scegliere il tipo giusto. D'altra parte, essendo solo un int, non c'è niente che ti impedisce di inserire un valore per il quale non hai fatto un nome, che è a volte utile.

  2. Non possono essere controllati in ogni caso. Cosa succede se si aggiungono due numeri insieme per ottenere il valore che verrà inserito nella variabile enum-typed? Potrebbe essere qualsiasi valore, generato in fase di esecuzione, quindi non può essere controllato (senza un sovraccarico, almeno).

  3. Tutto in C non è sicuro; non c'è praticamente nessuna funzionalità che il compilatore possa assolutamente impedire all'utente di abusare. le enumerazioni sono sicure perché sono efficaci nel prevenire l'errore del programmatore e la confusione, non perché smettono di fare qualcosa di stupido.

+0

L'altra cosa grandiosa di 'enum's è che alcuni compilatori ti avvisano se hai un blocco' switch' che attiva un 'enum', e ne lasci uno fuori dalle clausole' case'. – detly

+0

Ritengo che una cosa fastidiosa su alcuni compilatori, non una grande cosa su enum'. È molto probabile e anche probabile che un certo 'switch' gestisca solo un sottoinsieme di valori possibili di" enum "in virtù della precedente logica che ha escluso altri valori ... –

+0

@R ..: In quel caso * ahem *, puoi aggiungi semplicemente "default:/* error handlign code * /" per silenziare l'avviso. –

6

Si può fare un enum come

enum status { 
    ST_READY = 1 << 0, /* 1 */ 
    ST_WAIT = 1 << 1, /* 2 */ 
    ST_ERROR = 1 << 2, /* 4 */ 
    ST_HALT = 1 << 3, /* 8 */ 
    ST_ETC = 1 << 4, /* 16 */ 
}; 

Quindi definire un oggetto di quel tipo

enum status status; 

e impostarlo al OR bit a bit di un po 'di semplice' stati

status = ST_WAIT | ST_ERROR; /* recoverable error */ 

Si noti che il valore ST_WAIT | ST_ERROR è 6 e che quel valore non fa parte dell'enum.


per rispondere alle vostre domande:

  1. compilatore C consente al programmatore di se stesso spara in un piede.
  2. Il compilatore C consente al programmatore di spararsi al piede.
  3. Il compilatore C consente al programmatore di spararsi al piede.
+0

+1 C si presuppone che tu sappia cosa stai facendo e ti permetta di andare avanti nel modo più efficiente possibile - anche: g/foot/s // head/ – asc99c

+1

@ asc99c: lo farei come ': % s/piede/testa/g' – pmg

+0

@pmg Puoi dire '1 << 0' quale valore questo risultato? –

1

1) A quale tutti di caso in linguaggio C fa il compilatore non controlla il valore come come enum è interessato.

Non riesco a non capire la tua tribù.

1) In tutti i casi in linguaggio C, il compilatore non controlla il valore di un enum. [modificato]

Quando ci si assegna ad esso. L'assegnazione da interi nudi è consentita, quindi è possibile eseguire:

enum E { A, B } x; 
x = 10000; 

senza errore del compilatore. Inoltre, switch in enumerati non sono controllati per esaustività.

2) Perché le costanti enum non vengono controllate, per alcuni motivi? Quali sono queste ragioni?

Alla gente piace mettere interi in essi. per esempio.

enum E { END_OF_EVERYTHING = 5 }; 

dove 0-4 sono intesi come valori ordinari e 5 è un tipo di speciale.

3) Poiché enum non è controllato dal compilatore, l'enum è soggetto a errori?

Sì. Dal momento che le enumerazioni hanno solo valori del minimo numero di bit che possono prendere tutti i valori enum, è possibile ottenere risultati strani:

enum E { A = 1, B = -1 }; 

Questo enum contiene solo 2 bit di dati (valori di -2, -1, 0, 1). Se assegni 10000 al suo interno, possono accadere cose strane (effettivamente viste).

+0

in questo codice 'enum E {A = 1, B = -1};', come puoi dire che i valori sono -2, -1,0 , 1? –

Problemi correlati