2011-03-09 9 views
12

Así que una enumeración funciona así:¿Por qué usar enum cuando #define es igual de eficiente?

enum { 
    false, 
    true 
} 

lo que equivale a

int false = 0 
int true = 1 

Por qué no habría que sustituir enum con #define?

#define FALSE 0 
#define TRUE 1 

Para mí, parece que son intercambiables. Soy consciente de que #define es capaz de manejar argumentos, por lo tanto opera de una manera completamente diferente a enum. ¿Cuáles son exactamente los principales usos de enum cuando tenemos #defineen este caso?

Si tuviera que adivinar, como el #define es una función de preprocesador, enum tendría algunas ventajas de tiempo de ejecución. ¿Qué tan lejos estoy?

Gracias de antemano.

+1

ver http://stackoverflow.com/questions/136946/difference-between-enum-and-define-statements – SirDarius

+0

Impar, ese no apareció en mis resultados de búsqueda. ¡Gracias! – userenum

+1

No es equivalente a 'int false = 0' ni a' int const false = 0' (que sería más apropiado). Las variables 'int' tendrían una dirección, entonces podrías hacer' & false', que no puedes hacer para 'enum'. –

Respuesta

25

las ventajas de enum aparecen cuando tiene una larga lista de cosas que desea asignar a los números, y desea poder insertar algo en el medio de esa lista. por ejemplo, tiene:

 
pears 0 
apples 1 
oranges 2 
grapes 3 
peaches 4 
apricots 5 

ahora quiere poner mandarinas después de las naranjas. con #defines, tendrías que redefinir la cantidad de uvas, melocotones y albaricoques. usando enum, sucedería automáticamente. sí, este es un ejemplo artificial, pero con suerte te da la idea.

+1

Sí, ahora veo la diferencia. ¡Gracias! – userenum

+4

Esta es una buena respuesta. ** Pero supone ** que el lector (que podría ser cualquier NOOB) sabe que puede declarar un 'enum' con' pears 0' y NO numera el resto. – gideon

13

Me resulta útil para la depuración en un entorno como gdb, ya que los valores enum se manejan en tiempo de compilación (donde #define es una macro de preprocesador) y por lo tanto están disponibles para la introspección.

0

enum es una constante entera. entonces, habría una verificación de tipo durante el proceso de compilación.

+3

0 y 1 son también constantes enteras. –

+0

Gracias por apuntar bien, Jim. Parece que he leído sobre algunas implicaciones de enum w.r.t. encasillado y directamente transmitido sin mirar la pregunta real. La otra demarcación sería el uso de enumeraciones en el alcance del bloque. –

+0

En C++, las enumeraciones son tipos separados, pero no en C. –

3

Aunque su pregunta está etiquetada como C, hay una gran ventaja al escribir en C++, puede colocar enum: s dentro de clases o espacios de nombres. De esta forma podrías consultar tus constantes como 'SpaceshipClass :: galaxy'.