La diferencia es que el segundo enfoque declara un tipo llamado enum SomeEnum
y también declara un typedef-name SomeEnum
- un alias para ese tipo. En realidad, puede ser combinado en el equivalente de una sola línea
typedef enum SomeEnum { first, second, third } SomeEnum;
que hace que sea bastante obvio que la única diferencia entre los dos enfoques es si hay un nombre después de la palabra clave enum
. Con el segundo enfoque, puede declarar el objeto de ese tipo de enumeración utilizando SomeEnum e
o enum SomeEnum e
, según prefiera.
El primer enfoque solo declara el tipodef-name SomeEnum
para un tipo enum originalmente anónimo, lo que significa que está limitado a declaraciones SomeEnum e
.
Por lo tanto, siempre que solo use el tipo nombre -de-SomeEnum
en sus declaraciones, no habrá ninguna diferencia entre las dos. Sin embargo, en algunos casos es posible que deba usar el nombre original completo del tipo enum SomeEnum
. En la primera aproximación, ese nombre no está disponible, por lo que no tendrás suerte.
Por ejemplo, si después de la declaración anterior también se declara una variable llamada SomeEnum
en cierto margen anidada
int SomeEnum;
el nombre de la variable ocultará el typedef-nombre de la enumeración, lo que hace esta declaración ilegal
SomeEnum e; /* ERROR: `SomeEnum` is not a type */
Sin embargo, si se ha utilizado la segunda aproximación al declarar su enumeración, puede solucionar este problema utilizando el nombre de tipo completo
enum SomeEnum e; /* OK */
Esto no sería posible si utilizó la primera aproximación al declarar su tipo de enumeración.
Cuando se utiliza con estructuras, el nombre después de la struct
es una necesidad cuando se necesita un tipo de auto-referencia (un tipo que contiene un puntero al mismo tipo), como
typedef struct SomeStruct {
struct SomeStruct *next;
} SomeStruct;
Por último, en el segundo enfoque, el nombre typedef es totalmente opcional. Simplemente puede declarar
enum SomeEnum { first, second, third };
y sólo tiene que utilizar enum SomeEnum
cada vez que necesita para referirse a este tipo.