2009-11-30 6 views
3

Je commençais à être un peu confus avec typedef/enum jusqu'à ce que je réalise que je n'avais pas besoin de nommer l'emun. Y a-t-il des différences/avantages entre ces deux lorsqu'il est utilisé avec typedef, le 2ème me semble beaucoup plus facile à comprendre.unnamed enum & typedef?

Premier exemple:

typedef enum enumMenuItems { 
    none, 
    add, 
    save, 
    load, 
    list, 
    remove 
} menuItems; 

menuItems optionSelect = none; 

Deuxième exemple:

typedef enum { 
    Earth = 1, 
    Mars, 
    Saturn, 
    Neptune, 
    Jupiter 
} planets; 

planets closest = Mars; 

.

EDIT:

typedef enum enumMenuItems { 
    none, 
    add, 
    save, 
    load, 
    list, 
    remove 
} menuItems; 

Ainsi, le ci-dessus définit essentiellement deux types, l'un appelé enumMenuItems une énumération et la seconde un typedef de enumMenuItems appelé menuItems. Les deux déclarations ci-dessus sont essentiellement les mêmes, l'une utilisant typedef et l'autre utilisant l'énumération. Donc, si vous utilisez un typedef, vous pouvez laisser votre énumération sans nom car le type peut être consulté via le menu typedef menuItem.

gary

+0

Je suis un peu confus par votre édition, la mise en page n'est pas seulement une question de style ou de préférence personnelle? – fuzzygoat

+0

Bien sûr, je voulais juste mieux différencier entre la déclaration et l'utilisation des énumérations. NBD. –

+0

Les commentaires de votre montage semblent fondamentalement corrects. Il y a des arguties sémantiques, mais en pratique, je ne pense pas que cela ait de l'importance. –

Répondre

5

Le premier cas permet de faire référence au type de enum enumMenuItems. Par exemple:

enum enumMenuTimes optionSelect = none; 

Il pourrait être plus clair si vous le décomposer en deux parties:

enum _planets { 
    Earth = 1, 
    Mars, 
    Saturn, 
    Neptune, 
    Jupiter 
}; 
typedef enum _planets planets; 

enum _planets planet1 = Earth; 
planets  planet2 = Mars; 

Si cela simplifie le concept pour vous. Votre deuxième notation est juste un raccourci; il crée une énumération anonyme et utilise ensuite typedef pour lui donner un nom. Vous pouvez même, par exemple, faites:

enum { 
    Value0, 
    Value1, 
    Value2 
}; 

Mais vous ne pourrez pas utiliser l'énumération comme un nom de type faux, comme vous essayez de le faire. Cependant, vous pouvez toujours accéder aux valeurs énumérées. Une description plus détaillée est disponible sur le comp.lang.c FAQ.