2011-09-15 19 views
7

El siguiente texto es un extracto de C Programming Language, 2nd Edition, escrito por el creador del lenguaje C (así que supongo que es correcta):¿Por qué una compilación C no verifica?

Aunque las variables de tipos de enumeración pueden ser declarados, los compiladores no necesitan comprobar que lo que almacena en dicha variable es un valor válido para la enumeración.

tengo algunas dudas:

  1. Por lo casos en el lenguaje C no funciona el compilador de comprobar el valor de un enum?
  2. enum Las constantes no se verifican por algún motivo. Por qué no? ¿Cuales son las razones?
  3. Dado que enum no lo comprueba el compilador, ¿está usando enum propenso a errores? Por favor explique.
+0

a close vote why? –

+1

Alguien pensó que esto era un duplicado de/questions/432937/net-why-arent-enums-range-value-checked. Probablemente cambiaron de idea (la respuesta es la misma, pero la pregunta es acerca de un idioma diferente después de todo), pero no es posible eliminar una votación cerrada. –

Respuesta

8
  1. Una enumeración es como un número entero de lujo, y es mejor que la definición de una carga completa de constantes o macros del preprocesador como nombres para los valores constantes que desee almacenar, debido a que un compilador (o editor) puede compruebe que está utilizando los nombres y valores correctos para ir con el tipo correcto. Por otro lado, al ser solo una int, no hay nada que te impida poner un valor que no hiciste un nombre, que a veces es útil. No se pueden verificar en todos los casos. ¿Qué sucede si agrega dos números para obtener el valor que se va a poner en la variable enum? Podría ser cualquier valor, generado en tiempo de ejecución, por lo que no se puede verificar (sin muchos gastos indirectos, al menos).

  2. Todo en C no es seguro; Prácticamente no hay ninguna característica que el compilador pueda evitar totalmente que abuse. Las enumeraciones son seguras porque son efectivas para evitar el error y la confusión del programador, no porque te impidan hacer algo estúpido.

+0

La otra gran cosa acerca de 'enum's es que algunos compiladores te advierten si tienes un bloque' switch' que enciende un 'enum', y dejas una de las cláusulas' case '. – detly

+0

Considero que es una cosa molesta sobre algunos compiladores, no es una gran cosa sobre 'enum'. Es muy posible e incluso probable que un cierto 'interruptor' solo maneje un subconjunto de posibles valores 'enum' en virtud de una lógica anterior que haya descartado otros valores ... –

+0

@R ..: En ese caso * ahem *, puede simplemente agregue 'default:/* error handlign code * /' para silenciar la advertencia. –

6

Usted puede hacer una enumeración como

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 */ 
}; 

A continuación, defina un objeto de ese tipo

enum status status; 

y ponerlo en el operador OR de algunos 'simple' estados

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

Tenga en cuenta que el valor ST_WAIT | ST_ERROR es 6 y que ese valor no es parte de la enumeración.


para responder a sus preguntas:

  1. compilador de C permite al programador de pegarse un tiro en el pie.
  2. C compilador permite que el programador se dispare en el pie.
  3. C compilador permite que el programador se dispare en el pie.
+0

+1 C solo asume que sabe lo que está haciendo y le permite continuar con él de la manera más eficiente posible, también: g/foot/s // head/ – asc99c

+1

@ asc99c: Lo haría como ': % s/foot/head/g' – pmg

+0

@pmg ¿Puedes decir '1 << 0' en qué valor está el resultado? –

1

1) En lo que todo del caso en el lenguaje C hace que el compilador no comprueba el valor que como enumeración se refiere.

no puedo no entender habla su tribu.

1) En lo que todos los casos en lenguaje C no comprueba el compilador el valor de una enumeración. [editado]

Cuando lo asigne. La asignación de enteros enteros está permitida, por lo que puede hacer:

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

sin error del compilador. Además, switch es en enumeraciones no son verificación de exhaustividad.

2) ¿Por qué las constantes enum no están marcadas, por alguna razón? ¿Cuáles son esas razones?

A la gente le gusta poner enteros en ellas. p.ej.

enum E { END_OF_EVERYTHING = 5 }; 

donde 0-4 se consideran valores normales, y 5 es algo especial.

3) Dado que enum no es verificado por el compilador, ¿usar enum es propenso a errores?

Sí. Desde enumeraciones sólo tienen valores del menor número de bits que pueden tomar todos los valores de enumeración, se pueden obtener resultados extraños:

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

Esta enumeración sólo contiene 2 bits de datos (valores -2, -1, 0, 1) Si le asigna 10000, pueden suceder cosas extrañas (realmente vistas).

+0

en este código 'enum E {A = 1, B = -1};', ¿cómo podría decir que los valores son -2, -1,0 , 1? –

Cuestiones relacionadas