2012-03-27 22 views
7

¿Cuál es exactamente la diferencia entre:C++ typedef enum y justo ENUM

typedef enum { 
    something1, 
    something2, 
    ..... 
    somethingN 
} myEnum; 

fin justo

enum myEnum{ 
    something1, 
    something2, 
    ..... 
    somethingN 
}; 

Sé que en primer caso que he typedefed enumeración sin nombre, por supuesto, sólo se preguntan cuál es el enfoque es mejor y por qué?

+0

Con C++ 11 ahora, no debería usar ninguno de los siguientes: 'enum class' es más seguro. – leftaroundabout

+1

@leftaroundabout Si bien es una mejora, 'enum class' está lejos de ser un reemplazo completo. Le da dos cosas (alcance obligatorio y ninguna conversión implícita) pero a veces solo quiere una. –

+0

@leftaroundabout: Esto no responde la pregunta original. Solo lo redirige a otro lugar. – SasQ

Respuesta

15

La primera variante fue útil en C, porque de lo contrario tendrías que escribir enum myEnum donde quisieras usarla.

Este no es el caso en C++. Entonces, AFAIK, no hay beneficio para el primer caso en C++ (a menos que esté definiendo, por ejemplo, una interfaz que debe compartirse con C).

12

Sin diferencia. De hecho, la primera versión es de estilo C.

C++ 11 ha introducido stronly-typed enum, que se define como:

enum class myEnum //note the 'class' keyword after the 'enum' keyword 
{ 
    something1, 
    something2, 
    ..... 
    somethingN 
}; 

En C++ 03, enumeraciones no son de tipo seguro, son esencialmente enteros, y se puede mezclar con otros tipos integrales implícitamente, y otro problema con ellos es que no tienen alcance; puede usar su miembro sin calificar su tipo; puede usar something1. Mientras que las enumeraciones fuertemente tipadas de C++ 11 son seguras para el tipo, y tienen alcance; tienes que usar myEnum::something1.

+1

No es tan malo como sugieres en C++ 03. Las enumeraciones definen un tipo distinto, puede sobrecargarlas y puede definir operadores sobrecargados que las utilizan. La conversión implícita a un tipo integral es un poco molesto, pero no he encontrado que sea un problema en la práctica. –

+0

@JamesKanze: Bien, agregué el problema principal con C++ 03 enumeraciones. Además, si no estuvieran mal, C++ 11 no habría agregado enumeraciones fuertemente tipadas. – Nawaz

+1

El alcance nunca fue un problema. 'namespace scope_for_my_enum {enum {foo, bar}; } 'o' class scope_for_my_enum {enum {foo, bar}; }; 'dependiendo de si desea permitir que los clientes prescindan de él. De hecho, esto significa que las antiguas enumeraciones * son más flexibles * en términos de alcance. –

1

No utilizaría la primera. Es casi lo mismo que el otro. En C++ 11, con el segundo puede escribir myEnum::something1 pero no con el primero. También en C++ 11, puede reenviar enunciados enums en algunos casos, pero es imposible hacer declaraciones forward de tipos unmed y tampoco puede reenviar declare typedefs.