Estas son las diferencias entre las dos declaraciones/definiciones:
1) No puede utilizar un nombre typedef para identificar un constructor o un destructor
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) No puede ocultar un tipo de nombre como puede nombre introducido a través del encabezado de clase - o por el contrario si ya tiene una función o un objeto con un cierto nombre, todavía puede declarar una clase con ese nombre utilizando el encabezado de clase pero no a través del enfoque 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) No se puede utilizar un nombre typedef en un especificador de tipo elaborado
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) No se puede utilizar para definir anidada construye
struct S { struct M; };
typedef struct { } S::M; // not ok
struct S::M { }; // ok
Como se puede ver, hay una diferencia apreciable entre los dos. Algunas de las peculiaridades de typedefs son el resultado de la compatibilidad C (que es principalmente la razón por la que ambas formas creo) y, en la mayoría de los casos, declarar el nombre en el encabezado de clase es más natural que C++, tiene sus ventajas (especialmente cuando necesidad de definir constructores y destructores), y por lo tanto es preferible. Si está escribiendo código que necesita ser compatible con C y C++, entonces se beneficia el uso de ambos enfoques. Pero si estás escribiendo C++ puro, encuentro que especificar el nombre de clase en el encabezado de clase es más legible.
Este es un duplicado de http://stackoverflow.com/questions/612328/difference-between -struct-and-typedef-struct-in-c, pero no voy a votar a favor del cierre porque la respuesta aceptada a esa pregunta es (sutilmente) incorrecta, como se explica en la respuesta del segundo voto ... –