2010-06-25 10 views
8

enum y #define parecen ser capaces de hacer lo mismo, para el siguiente ejemplo que define un estilo. Comprenda que #define es la sustitución de macro para el preprocesador del compilador. ¿Hay alguna circunstancia por la cual uno es preferido sobre el otro?enum o define, ¿cuál debo usar?

typedef enum { 
    SelectionStyleNone, 
    SelectionStyleBlue, 
    SelectionStyleRed 
} SelectionStyle; 

vs

#define SELECTION_STYLE_NONE 0 
#define SELECTION_STYLE_BLUE 1 
#define SELECTION_STYLE_RED 2 
+0

Ver también: [¿Debo usar #define, enum o const?] (Http://stackoverflow.com/questions/112433/should-i-use-define-enum-or-const) – Shog9

Respuesta

3

Una enumeración es la mejor si quieres seguridad de tipos. También se exportan como símbolos, por lo que algunos depuradores pueden mostrarlos en línea mientras que no pueden para define.

El principal problema con las enumeraciones es que solo pueden contener números enteros. Para cuerdas, flotadores, etc. ... es posible que sea mejor con un const o un definir.

+0

¿Qué quieres decir? sobre la seguridad tipo? este código es legal: enum E {A = 1}; E t = E (2); y el resultado no está definido. Por lo tanto, las enumeraciones son TIPO seguras, pero no VALOR seguras, por lo que son casi incorrectas, ya que define/ – f0b0s

+0

Con los moldes puedes hacer todo, eso no prueba nada. – kmm

11

no lo utilices define a menos que debe tener la funcionalidad del preprocesador. Para algo tan simple como una enumeración integral, use una enumeración.

1

Las definiciones son probablemente un poco más rápidas (en tiempo de ejecución) que las enumeraciones, pero el beneficio es probablemente solo un puñado de ciclos, por lo que es insignificante a menos que esté haciendo algo que realmente lo requiera. Me gustaría ir con enum, ya que usar el preprocesador es más difícil de depurar.

+1

Creo que quieres decir "ir con la enumeración"? – nall

1

Cuando hay una función de idioma incorporado que admite lo que desea hacer (en este caso, enumerar elementos), probablemente debería usar esa característica.

0
#define DEFINED_VALUE 1 
#define DEFINED_VALUE 2 // Warning 
enum { ENUM_VALUE = 1 }; 
enum { ENUM_VALUE = 2 }; // Error 

Con #define, hay una mayor probabilidad de introducir errores sutiles.