2009-03-29 12 views
11

compilando con gcc C99typedef enum, asignando un valor dentro de

He estado usando enums desde hace un tiempo. Sin embargo, estoy usando algún código de muestra para desarrollar mi aplicación. Y encontré un código como este. Me informaron que este es el mejor uso de práctica cuando se utilizan enumeraciones. Pero no veo cómo esto tiene ninguna ventaja.

typedef enum { 
    TYPE_DATE, 
    TYPE_TIME, 
    TYPE_MONEY, 

    TYPE_COUNT, 
    TYPE_UNKNOWN = TYPE_COUNT 
} string_type_e; 

Por qué tienen la TYPE_COUNT y por qué asignar a TYPE_COUNTTYPE_UNKNOWN?

Muchas gracias por todas las sugerencias,

valores

Respuesta

17

De forma predeterminada, el compilador automáticamente da valores enteros a partir de 0. Entonces la fecha será cero, el tiempo uno y el dinero dos. El siguiente valor se da al valor enum 'psuedo' TYPE_COUNT, que recibirá el valor tres, que resulta ser el número de valores de enum 'propios'.

TYPE_UNKNOWN es otro valor que representa algo que no es un valor 'adecuado', por lo que fallará una prueba e < TYPE_COUNT. Tenerlo igual a TYPE_COUNT significa que cada valor significativo distinto es contiguo, pero no conozco ninguna ventaja significativa para eso (habría si TYPE_COUNT fuera uno menos que una potencia de 2, lo que podría afectar la representación que el compilador podría usar , y su 'agradable' para tener los valores contiguos, pero en realidad no importa, ya que no sería incrementarlos pasado TYPE_COUNT de todos modos)

+0

¿Podría asignar valores como 0x2 y 0xfffe a las constantes nombradas en una enumeración? – Namratha

+1

@Namratha podrías, y es bastante común que haya algún protocolo donde los valores se fijen como parte de la interfaz con otro componente.En tales casos, probablemente no use algo como 'TYPE_COUNT' al final, ya que a menos que los valores sean contiguos, entonces no contará sobre ellos. –

6

Enum son básicamente constantes enteras. Por defecto reciben el valor del último elemento en la enumeración + 1 (y 0 para el primer elemento). Cuando desee contar los elementos, que podrían ser útiles para mapearlo con una matriz o algo así, de la enumeración así declarada (que se actualizará dinámicamente si agrega o elimina algo de ella), puede poner un COUNT constante en al final (TYPE_COUNT en su ejemplo). Para poder distinguir valores inválidos en la enumeración, es posible que desee declarar otra constante. En su ejemplo, esa constante será igual a la constante de recuento, que es un valor mayor que el valor más grande de su enumeración.

3

¿Por qué tener el type_count y por qué asignar type_count a type_unknown?

Para mantener una pestaña en el valor máximo permitido para enum. Recuerde, de lo contrario no habría forma de verificar si un valor determinado es correcto (dentro del rango) o no.

+0

Pero puede haber lagunas y superposiciones dentro del rango de una enumeración, no en el ejemplo, sin duda, sino en las enumeraciones en general. –

+0

@ Jonathan: Si el autor estuviera diseñando una enumeración con espacios en la secuencia subyacente, entonces este método para definir una constante de recuento sería inútil. Así que un autor que desee lo último evitará lo primero, así de simple. – Shog9

2

TYPE_COUNT puede servir para dimensionar una matriz indexada por los elementos de la enumeración:

type_info my_info[TYPE_COUNT]; 

o se puede utilizar en una condición de salida de un bucle for. TYPE_UNKNOWN se puede utilizar para representar un valor ilegal o indefinido para el tipo (-1 podría ser una alternativa a TYPE_COUNT por su valor).

Cuestiones relacionadas