Voici les différences entre les deux déclarations/définitions:
1) Vous ne pouvez pas utiliser un nom typedef pour identifier un constructeur ou 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) Vous ne pouvez pas cacher un nom de typedef comme vous le pouvez nom introduit via la tête de classe - ou inversement si vous avez déjà une fonction ou un objet avec un certain nom, vous pouvez toujours déclarer une classe avec ce nom en utilisant la tête de classe mais pas via l'approche 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) Vous ne pouvez pas utiliser un nom de typedef dans un spécificateur de type élaboré
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) Vous ne pouvez pas l'utiliser pour définir imbriquée Structures
struct S { struct M; };
typedef struct { } S::M; // not ok
struct S::M { }; // ok
Comme vous pouvez le voir, il y a une différence perceptible entre les deux. Certaines des bizarreries de typedefs sont le résultat de la compatibilité C (ce qui explique pourquoi les deux manières existent je crois) - et dans la plupart des cas, déclarer le nom dans la classe est plus naturel C++ - il a ses avantages besoin de définir des constructeurs et des destructeurs), et est donc préférable. Si vous écrivez du code qui doit être compatible C et C++, il est avantageux d'utiliser les deux approches. Mais si vous écrivez du C++ pur, je trouve que spécifier le nom de classe dans la classe-tête soit plus lisible.
C'est un double de http://stackoverflow.com/questions/612328/difference-between -struct-and-typedef-struct-in-c, mais je ne vais pas voter pour la clôture parce que la réponse acceptée à cette question est (subtilement) erronée, comme expliqué dans la deuxième réponse votée ... –