Voir cette réponse à une question connexe. Il est une longue citation d'un article qui explique Dan Saks cette question aussi clairement que tout ce que je suis venu à travers:
Difference between 'struct' and 'typedef struct' in C++?
La technique peut prévenir les problèmes réels (bien que des problèmes certes rares). C'est une assurance bon marché - c'est zéro coût à l'exécution ou dans l'espace de code (le seul coût est les quelques octets dans le fichier source), mais la protection que vous obtenez est si petite qu'il est rare de voir quelqu'un l'utiliser régulièrement. J'ai un extrait de "nouvelle classe" qui inclut le typedef, mais si je code réellement une classe à partir de zéro sans utiliser l'extrait, je ne m'inquiète presque jamais (ou est-ce que je me souviens?) D'ajouter le typedef.
Je dirais que je suis en désaccord avec la plupart des avis donnés ici - il vaut la peine de mettre ces typedefs, mais ne suffit pas que je donnerais tout le monde (y compris moi-même) le chagrin de ne pas les mettre dans
.
on m'a demandé un exemple de comment ne pas avoir un nom de classe typedef peut entraîner un comportement inattendu - est ici un exemple soulevé plus ou moins de l'article Saks:
#include <iostream>
#include <string>
using namespace std;
#if 0 // change to #if 1 to get different behavior
// imagine that this is buried in some header
// and even worse - it gets added to a header
// during maintenance...
string foo()
{
return "function foo... \n";
}
#endif
class foo
{
public:
operator string() {
return "class foo...\n";
}
};
int main()
{
string s = foo();
printf("%s\n", s.c_str());
return 0;
}
Lorsque la déclaration de fonction est faite visible, le comportement du programme change silencieusement car il n'y a pas de conflit de nom entre la fonction foo
et la cla ss foo
. Cependant, si vous incluez un "typedef class foo foo;
", vous obtiendrez une erreur de compilation au lieu d'une différence de comportement silencieuse.
peut-être que vous devriez demander à cette personne? plutôt que de demander à tout le monde, mais cette personne. – DevinB
Je voulais obtenir un consensus sur le fait que cela en valait la peine plutôt que sur l'explication d'une personne. –
Et le gars avait en réalité tort. "non-tag cache le nom de tag en C++" - ni vrai en C, ni vrai en C++. Pour un peu d'inspiration, lisez ce rapport de défaut http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#407 –