34 votes

Le nom typedef est-il facultatif dans une déclaration typedef?

J'ai été assez surpris quand j'ai vu le code suivant compile sans erreurs ou des avertissements dans g++-4.2:

typedef enum test { one };

Mon hypothèse était que si vous avez utilisé l' typedef mot-clé, il aurait besoin d'un identificateur comme dans:

typedef enum test { one } test;

Comme déjà mentionné, g++-4.2 l'accepte sans même un avertissement. Clang++ 3.0 prévient "attention: typedef nécessite un nom", de même Comeau prévient "attention: la déclaration exige une définition de type nom, et g++-4.6 informe: "avertissement: 'typedef" a été ignoré dans la présente déclaration".

Je n'ai pas été en mesure de déterminer où dans la norme de ce qui est permis, et je trouve ça un peu confus que deux des compilateurs avertir qu'il est nécessaire, ne devrait-elle pas être une erreur si la définition de type de nom est nécessaire mais n'est pas présent?

Mise à JOUR: j'ai vérifié en C avec la même compilateurs. Clang et comeau rendement de la même sortie, gcc donne un avertissement: "attention: inutile de stockage de classe spécificateur de vide déclaration", ce qui semble encore plus de confusion.

Mise à JOUR: j'ai vérifié la suppression du nom de l'enum et les résultats sont les mêmes:

typedef enum { one };

De la même façon avec un nom struct:

typedef struct named { int x };

Mais pas avec une nouvelle structure, dans lequel cas, le code a été rejetée en g++ (4.2/4.6) avec "erreur: manque de type nom dans la définition de type-déclaration", gcc (4.2/4.6) a donné un avertissement: "attention: sans nom struct/union qui définit aucun cas", clang++ "avertissement: déclaration ne rien déclarer", comeau "erreur: déclaration requiert une définition de type de nom"

3voto

Xeo Points 69818

La seule chose que j'ai pu trouver a été le suivant dans le C++03 standard §7.1.3 [dcl.typedef] p1:

typedef-nom:

  • identificateur de

Un nom déclaré à l' typedef spécificateur devient un typedef-nom.

Avis le manque d'opter après identificateur, qui indique, au moins pour moi, qu'un identificateur est nécessaire pour la définition de type-nom. Étrange que tous testés compilateurs (silencieusement) accepter cela.


Edit: Après @la réponse de Jonathan, j'ai trouvé ce qui suit dans la même norme que ci-dessus:

decl-rédacteur de devis:

  • de stockage de classe-rédacteur de devis
  • type spécificateur de
  • la fonction de rédacteur de devis
  • friend
  • typedef

Comme on peut le voir, il fournit un supplément de cas pour typedef et la liste de stockage de classe spécificateurs le confirme:

de stockage de classe-rédacteur de devis:

  • auto
  • register
  • static
  • extern
  • mutable

Donc, nous sommes tout aussi paumé qu'avant dans le C++ cas.

0voto

luser droog Points 9030

Cela ressemble vraiment à une différence entre C et C ++, pour moi. C ++ typedefs implicitement structs et unions à leurs balises; l'ajout du typedef est donc superflu, mais pas une erreur. Je ne sais pas si cela fonctionne aussi pour les énumérations.

La chose à faire ensuite est de voir quelles définitions de variables sont autorisées après ces déclarations.

 enum test etest;
test etest2;
struct named snamed;
named snamed2;
 

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