# Definir o enumerar?

Posible duplicado:
¿Por qué usar enumeración cuando #define es igual de eficiente?

Cuando se progtwig en C, ¿es una mejor práctica usar #define sentencias o enumeraciones para estados en una máquina de estados?

Dado que los estados son elementos relacionados, creo que es mejor tener una enumeración que los defina.

Técnicamente no importa. El comstackdor probablemente creará un código de máquina idéntico para cada caso, pero una enumeración tiene tres ventajas:

  1. Usando la combinación correcta de comstackdor + depurador, el depurador imprimirá las variables de enumeración por su nombre de enumeración y no por su número. Entonces, “StateBlahBlup” se lee mucho mejor que “41”, ¿no es así?

  2. No tiene que dar un número explícito a cada estado, el comstackdor hace la numeración por usted si lo deja. Supongamos que ya tiene 20 estados y desea agregar un nuevo estado en el medio, en el caso de define, tiene que volver a numerar todo por su cuenta. En caso de enumeración, simplemente puede agregar el estado y el comstackdor volverá a numerar todos los estados debajo de este nuevo estado para usted.

  3. Puede decirle al comstackdor que le avise si una instrucción de cambio no maneja todos los valores posibles de enumeración, por ejemplo, porque olvidó manejar algunos valores o porque la enumeración se extendió pero olvidó actualizar también las instrucciones de cambio que manejan valores de enumeración sin embargo, no avise si hay un caso default , ya que todos los valores no manejados explícitamente terminan en el caso predeterminado).

No hay una respuesta definitiva. enum ofrece el scope y la asignación automática de valores, pero no otorga ningún control sobre el tipo constante (siempre con signed int ). #define ignora el scope, pero le permite usar mejores recursos de escritura: le permite elegir el tipo de constante (ya sea mediante el uso de sufijos o mediante la inclusión de una conversión explícita en la definición).

Entonces, elige para ti lo que es más importante para ti. Para una máquina de estados, la enum podría ser una mejor opción, a menos que tenga una buena razón para controlar el tipo.

Prefiero enumeración Son más compactos y son ‘más seguros’. También puede implicar orden en una enumeración, lo que podría ser útil en una máquina de estados. #defines deben evitarse si es posible, ya que sobrescribirán todas las ocurrencias en la fuente, lo que puede llevar a algunas acciones no deseadas que son difíciles de depurar.

Si su comstackdor soporta enum , entonces sería preferible. A falta de eso, por supuesto, usa #define . Todos los comstackdores de C ++ y los comstackdores de C modernos deben admitir la enum , pero los comstackdores más antiguos (en particular los que se dirigen a plataformas integradas) pueden no admitir la enum .

Si debe usar #define asegúrese de definir sus constantes entre paréntesis, para evitar errores de preprocesador:

 #define RED_STATE (1) #define YELLOW_STATE (2) #define GREEN_STATE (3) 

#define directivas #define pueden tener muchas consecuencias involuntarias y no seguir las reglas comunes de scope. Use enumeraciones cuando tenga datos relacionados.

Más información: http://www.embedded.com/columns/programmingpointers/9900402?_requestid=341945 [material de C ++, pero aún marginalmente relevante]

Puede hacer este truco para hacer que el comstackdor verifique el tipo de valor #define .

 #define VALUE_NAME ((TYPE_NAME) 12) 

Sin embargo, el problema real de #define es que puede ser redefinido en el código de la aplicación. (Por supuesto que el comstackdor te lo advertirá).

enum es excelente cuando tiene opciones exclusivas, pero no puede usarlas para definir indicadores de campo de bits, como esto:

 #define SQ_DEFAULT 0x0 #define SQ_WITH_RED 0x1 #define SQ_WITH_BLUE 0x2 void paint_square(int flags); 

Luego puedes pintar el cuadrado rojo-azul con:

 paint_square(SQ_WITH_RED | SQ_WITH_BLUE); 

… lo que no se puede con enum .

Puedes usar lo que quieras y te guste.

Aún así, como todos dicen, también me gustaría sumrme a mí para votar por Enums.

Las enumeraciones siempre deben ser preferibles si está utilizando datos relacionados, ya que en el caso de una máquina de estados, puede definir el orden en las enumeraciones también, lo que ayudará en la implementación de la máquina de estados.

Otras enumeraciones mantendrán su progtwig seguro, ya que todas las enumeraciones serán de su tipo solamente, por lo que también evitarán posibles confusiones.

#define no debe utilizarse en el caso de una máquina de estado o datos relacionados. De todos modos esa es mi sugerencia, pero no hay una regla dura y rápida.

También me gustaría agregar un punto más que las enumeraciones agregarán más legibilidad y comprensión a su código si se usa en el futuro o si alguien más lo leyó. Es un punto importante cuando tiene un progtwig muy grande y hay muchos #defines en el progtwig además de los que está utilizando para su State Machine.