Qui ci sono le differenze tra le due dichiarazioni/definizioni:
1) Non è possibile utilizzare un nome typedef per identificare un costruttore o un distruttore
struct MyStruct { MyStruct(); ~MyStruct(); }; // ok
typedef struct { MyStructTD(); ~MyStructTD(); } MyStructTD; // not ok
// now consider
typedef struct MyStruct2 { MyStruct2(); } MyStructTD2; // ok
MyStructTD2::MyStruct2() { } // ok
MyStructTD2::MyStructTD2() { } // not ok
2) Non è possibile nascondere un nome typedef come se fosse possibile nome introdotto tramite la classe-head - o viceversa se hai già una funzione o un oggetto con un certo nome, puoi comunque dichiarare una classe con quel nome usando la classe-head ma non tramite l'approccio typedef.
struct MyStruct { }; // ok
typedef struct { } MyStructTD; // ok
void MyStruct() { } // (1) - ok Hides struct MyStruct
void MyStructTD() { } // (2) - not-ok - ill-formed
//> Or if you flip it around, consider in a new translation unit:
void MyStruct() { } // ok
void MyStructTD() { } // ok
struct MyStruct { }; // ok
typedef struct { } MyStructTD; // Not ok
3) Non è possibile utilizzare un nome typedef in un indicatore di tipo elaborato
struct MyStruct { }; // ok
typedef struct { } MyStructTD; // ok
int main()
{
void MyStruct();
void MyStructTD(); // ok - new declarative region
struct MyStruct ms; // ok - names the type
struct MyStructTD ms2; // not ok - cannot use typedef-name here
}
struct AnotherStruct
{
friend struct MyStruct; // ok
friend struct MyStructTD; // not ok
};
4) Non è possibile utilizzare per definire nidificato structs
struct S { struct M; };
typedef struct { } S::M; // not ok
struct S::M { }; // ok
Come si può vedere, c'è una differenza visibile tra i due. Alcuni dei capricci di typedef sono il risultato della compatibilità con C (che è principalmente il motivo per cui entrambi i modi esistono credo) - e nella maggior parte dei casi, dichiarare il nome in classe è un C++ più naturale - ha i suoi vantaggi (specialmente quando bisogno di definire costruttori e distruttori), ed è quindi preferibile. Se stai scrivendo un codice che deve essere compatibile con C e C++, allora c'è un vantaggio nell'usare entrambi gli approcci. Ma se stai scrivendo puro C++, trovo che sia più leggibile specificare il nome della classe nella testa della classe.
fonte
2009-07-05 14:49:13
Questo è un duplicato di http://stackoverflow.com/questions/612328/difference-between -struct-and-typedef-struct-in-c, ma non ho intenzione di votare per la chiusura perché la risposta accettata a questa domanda è (sottilmente) sbagliata, come spiegato nella risposta secondo-votata ... –