Est la définition de type-nom facultatif dans une définition de type de déclaration?

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é le typedef mot-clé, il aurait besoin d'un identificateur dans:

typedef enum test { one } test;

Comme déjà mentionné, g++-4.2 l'accepte sans même un avertissement. Clang++ 3.0 avertit "avertissement: typedef nécessite un nom", de même Comeau avertit "avertissement: déclaration requiert 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 nom-de-l'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: "avertissement: 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 même 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: "avertissement: 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 nom"

  • Intéressant, VS2010 accepte aussi le code sans avertissement / d'erreur.
  • N'est-ce pas la syntaxe typedef enum { one } test?
  • ouais, je pense que ça doit être une erreur.
  • C'est la syntaxe pour une sans nom enum, pas ce qui est demandé ici.
  • Ce n'est pas vraiment le C++, est-il?
  • Pourquoi n'est-ce pas?
  • C++ ne nécessite pas l'enum qualifier une fois qu'il a déjà été typedef avais.
  • Et cela fait de la non-C++ dans quel sens? Je ne nécessite même pas l'enum qualifier si elle n'a pas été typedef'd.
  • C++ est plus typesafe.