La differenza è che il secondo approccio dichiara un tipo denominato enum SomeEnum
e dichiara anche un nome typedef SomeEnum
- un alias per quel tipo. Si può effettivamente essere combinati in equivalente one-liner
typedef enum SomeEnum { first, second, third } SomeEnum;
che rende piuttosto evidente che l'unica differenza tra i due approcci è se c'è un nome dopo la parola chiave enum
. Con il secondo approccio, puoi dichiarare l'oggetto di quel tipo di enum utilizzando SomeEnum e
o enum SomeEnum e
, a seconda di quale preferisci.
Il primo approccio dichiara solo il nome typedef SomeEnum
per un tipo enum originariamente anonimo, il che significa che si è limitati alle dichiarazioni SomeEnum e
.
Quindi, se si utilizza solo il nome typedef SomeEnum
nelle dichiarazioni, non vi sarà alcuna differenza tra i due. Tuttavia, in alcuni casi potrebbe essere necessario utilizzare il nome originale completo del tipo enum SomeEnum
. Nel primo approccio quel nome non è disponibile, quindi sarai sfortunato.
Per esempio, se dopo la dichiarazione di cui sopra si dichiara anche una variabile denominata SomeEnum
in qualche ambito nidificato
int SomeEnum;
il nome della variabile nasconderà il typedef-name della enum, rendendo così questa dichiarazione illegale
SomeEnum e; /* ERROR: `SomeEnum` is not a type */
Tuttavia, se è stato utilizzato il secondo approccio quando si dichiara il vostro enum, è possibile aggirare il problema utilizzando il nome di tipo completo
enum SomeEnum e; /* OK */
Questo non sarebbe possibile se si usasse il primo approccio quando si dichiara il tipo di enum.
Quando viene utilizzato con le strutture, il nome dopo il struct
è un must quando si ha bisogno di un tipo di auto-riferimento (un tipo che contiene un puntatore allo stesso tipo), come
typedef struct SomeStruct {
struct SomeStruct *next;
} SomeStruct;
Infine, nella secondo approccio il nome typedef è totalmente opzionale. Si può semplicemente dichiarare
enum SomeEnum { first, second, third };
e basta usare enum SomeEnum
ogni volta che è necessario fare riferimento a questo tipo.