Las enumeraciones (enum) en el lenguaje C son una forma de definir un conjunto de constantes numéricas nombradas. La sintaxis típica es:
enum Color { ROJO, VERDE, AZUL };
Por defecto, el primer valor se asigna como 0, y cada siguiente recibe el anterior + 1.
Ventajas de las enumeraciones:
enum como un tipo independiente).Desventajas:
enum en el estándar C tiene tipo int (hasta C99), por lo que no hay estricta seguridad de tipos.enum e int (sin control de rango).enum MyType : unsigned char — pero esto es una extensión).Ejemplo:
enum Estado { INICIO = -1, EJECUTANDO = 0, PAUSADO = 1, DETENIDO = 2 }; enum Estado actual = EJECUTANDO;
Pregunta: ¿Se pueden comparar de manera segura los valores de diferentes enumeraciones entre sí?
Respuesta: A pesar de que técnicamente los valores de enum son int, no se recomienda comparar variables de diferentes enumeraciones. Esto conduce a la pérdida de semántica y puede confundir al lector, además de complicar el mantenimiento del código en el futuro. Es mejor convertir explícitamente el tipo o reorganizar las enumeraciones lógicamente.
Ejemplo de error:
enum Fruta { MANZANA, BANANA }; enum Animal { GATO, PERRO }; if ((enum Fruta)BANANA == (enum Animal)GATO) { ... } // Error lógico
Historia
En el protocolo de mensajes interprocesador, se limitaban a #define con nombres no únicos, lo que llevó a colisiones de valores al ampliar el protocolo. La traducción a enum permitió simplificar el control de los identificadores utilizados y facilitó la depuración.
Historia
En una gran biblioteca, el control del estado se realizaba con valores enteros rígidos. Al refactorizar, se olvidaron de sincronizar todos los define a los nuevos valores. El uso de enum permitió prevenir esto, pero un módulo continuó utilizando define obsoletos, causando errores difíciles de detectar.
Historia
En un sistema de control de nodos robotizados, el ingeniero no asignó valores explícitamente para el primer elemento de la enum (solo se usaron el segundo y el tercero). El programa funcionaba incorrectamente porque, por defecto, el primer elemento tenía el valor 0, lo que conflictuaba con la lógica del protocolo de intercambio que esperaba otro valor.