193 votes

Pourquoi utilisez-vous typedef pour déclarer une énumération en C ++?

Je n'ai pas écrit de C ++ depuis des années et maintenant j'essaye d'y revenir. J'ai alors couru à travers cela et pensé à abandonner:

 typedef enum TokenType
{
    blah1   = 0x00000000,
    blah2   = 0X01000000,
    blah3   = 0X02000000
} TokenType;
 

Qu'est-ce que c'est? Pourquoi le mot clé typedef -il utilisé ici? Pourquoi le nom TokenType apparaît-il deux fois dans cette déclaration? Comment la sémantique diffère-t-elle de ceci:

 enum TokenType
{
    blah1 = 0x00000000,
    blah2=0x01000000,
    blah3=0x02000000
};
 

160voto

Ryan Fox Points 5181

En C, déclarer votre enum de la première façon vous permet de l'utiliser de la manière suivante:

 TokenType my_type;
 

Si vous utilisez le second style, vous serez obligé de déclarer votre variable comme ceci:

 enum TokenType my_type;
 

Comme mentionné par d'autres, cela ne fait aucune différence en C ++. Mon hypothèse est que la personne qui a écrit ceci est un programmeur C au cœur ou que vous compilez du code C en tant que C ++. Dans les deux cas, cela n'affectera pas le comportement de votre code.

105voto

mat Points 5365

C’est un patrimoine de C, c, si vous le faites :

vous devrez l’utiliser quelque chose comme :

Mais si vous faites ceci :

Vous serez en mesure de déclarer :

Mais en C++, vous pouvez utiliser uniquement la première définition et utilisez-le comme si elle était dans un typedef de C.

21voto

Vous n'avez pas besoin de le faire. En C (pas C++) il vous a été demandé d'utiliser enum Enumname pour faire référence à un élément de données de type énuméré. Pour simplifier, vous ont été autorisés à la définition de type à un seul nom type de données.

typedef enum MyEnum { 
  //...
} MyEnum;

fonctions autorisées en prenant un paramètre de l'enum être défini comme

void f( MyEnum x )

au lieu de la plus

void f( enum MyEnum x )

Notez que le nom de la propriété typename n'a pas besoin d'être égal au nom de l'enum. La même chose arrive avec les structures.

En C++, d'autre part, il n'est pas nécessaire, comme les énumérations, les classes et les structures peuvent être accessibles directement, en tant que par leurs noms.

// C++
enum MyEnum {
   // ...
};
void f( MyEnum x ); // Correct C++, Error in C

11voto

BeWarned Points 1314

En C, c’est bon style parce que vous pouvez modifier le type d’autre chose que d’un enum.

En C++, vous pouvez définir l’enum afin qu’il compilera sous forme C++ ou C.

7voto

Tim Points 13334

Vestige de C.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X