varias razones:
Razón 1: Flexibilidad:
enum lickahoctor { yes = 0, no = 1, maybe = 2 };
declara una enumeración. Puede usar los valores yes
, no
y maybe
en cualquier parte y asignarlos a cualquier tipo integral. También puede utilizar esto como un tipo, escribiendo
enum lickahoctor myVar = yes;
Esto hace que sea agradable porque si una función tiene un parámetro con el tipo de enumeración lickahoctor sabrá que puede asignar yes
, no
o maybe
a ella. Además, el depurador lo sabrá, por lo que mostrará el nombre simbólico en lugar del valor numérico. El problema es que el compilador solo le permitirá asignar valores que haya definido en enum lickahoctor
a myVar
. Si, por ejemplo, desea definir algunas banderas en la clase base, y luego agregar algunas banderas más en la subclase, no puede hacerlo de esta manera.
Si utiliza una int en su lugar, no tiene ese problema. Entonces, quiere usar algún tipo de int, para poder asignar constantes arbitrarias.
Razón 2: La compatibilidad binaria:
El compilador elige un buen tamaño que se ajusta a todas las constantes que ha definido en una enumeración. No hay garantía de lo que obtendrás. Por lo tanto, si escribe una estructura que contiene dicha variable directamente en un archivo, no hay garantía de que seguirá siendo del mismo tamaño cuando la vuelva a leer con la próxima versión de su aplicación (según el estándar C, al menos, - no es tan sombrío en la práctica).
Si utiliza algún tipo de int en su lugar, la plataforma generalmente garantiza un tamaño particular para ese número. Especialmente si usa uno de los tipos garantizados para un tamaño particular, como int32_t
/uint32_t
.
Razón 3: La legibilidad y la auto-documentación
Cuando se declara miVar anterior, es evidente de inmediato los valores que se puede poner en ella. Si solo usa un int, o un uint32_t
, no lo es. Así que lo que hace es utilizar
enum { yes, no, maybe };
typedef uint32_t lickahoctor;
para definir un buen nombre para el número entero algún lugar cerca de las constantes que recordar a la gente que una variable de este tipo puede contener este valor. Pero aún así obtiene el beneficio de un tamaño fijo y predecible y la capacidad de definir valores adicionales en subclases, si es necesario.
Razón 4: Apoyo a campos de bits
las variables de enumeración escrita a máquina única cesión de manutención exactamente un valor de sus opciones. Entonces, si intenta implementar un campo de bit, no puede escribirlo como un campo de bits. Además, debe usar variables sin signo para evitar que la extensión de signo lo atornille.
typedef y enum son muy diferentes ... Realmente no entiendo su pregunta? enumeraciones se utilizan para configurar colecciones de constantes enteras con nombre. typedef se utilizan para dar un nuevo nombre a un tipo de datos, a menudo para admitir arquitecturas diferentes ... – t00ny