Vedere questa risposta precedente a una domanda correlata. E 'una lunga citazione da un articolo di Dan Saks che spiega la questione nel modo più chiaro come qualsiasi cosa che abbia mai incontrato:
Difference between 'struct' and 'typedef struct' in C++?
La tecnica può prevenire i problemi reali (anche se i problemi certamente raro).
E 'un po' poco di assicurazione - è a costo zero in fase di esecuzione o in spazio di codice (l'unico costo è i pochi byte nel file di origine), ma la protezione che si ottiene è così piccolo che è raro vedere qualcuno usarlo costantemente. Ho uno snippet di "nuova classe" che include il typedef, ma se effettivamente codifico una classe da zero senza usare lo snippet, non mi preoccupo quasi mai (o si ricorda?) Di aggiungere typedef.
Quindi direi sono d'accordo con la maggior parte delle opinioni qui riportati - vale la pena di mettere quelle typedef, ma non basta che darei a nessuno (me compreso) il dolore di non metterli in
.
mi è stato chiesto per un esempio di come non avere un nome di classe typedef'ed può causare un comportamento imprevisto - ecco un esempio sollevato più o meno dall'articolo 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;
}
Quando la dichiarazione di funzione è fatto visibile, il comportamento del programma cambia in modo silenzioso perché non vi è alcun conflitto di nomi tra la funzione foo
e la cla ss foo
.
Tuttavia, se si include "typedef class foo foo;
", si otterrà un errore di compilazione anziché una differenza di comportamento non presidiata.
fonte
2009-06-05 06:02:21
forse dovresti chiedere a quella persona? piuttosto che chiedere a tutti tranne quella persona. – DevinB
Volevo ottenere un consenso se ne valeva la pena, piuttosto che la spiegazione di una persona. –
E il ragazzo in realtà si sbagliava. "non tag nasconde il nome del tag in C++" - né true in C, né true in C++. Per qualche ispirazione, leggi questo rapporto sui difetti http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#407 –