Unterschied zwischen 'struct' und 'typedef struct' in C++?
Gibt es in C++ einen Unterschied zwischen:
struct Foo { ... };
und
typedef struct { ... } Foo;
796
3
Gibt es in C++ einen Unterschied zwischen:
struct Foo { ... };
und
typedef struct { ... } Foo;
In C++ gibt es nur einen feinen Unterschied. Es ist ein Überbleibsel aus C, in dem es einen Unterschied macht.
Der C-Sprachstandard (C89 §3.1.2.3, C99 §6.2.3 und C11 §6.2.3) schreibt getrennte Namensräume für verschiedene Kategorien von Bezeichnern vor, darunter tag identifiers (für
struct
/union
/enum
) und ordinary identifiers (fürtypedef
und andere Bezeichner).Wenn Sie gerade gesagt haben:
würde man einen Compilerfehler erhalten, da
Foo
nur im Tag-Namensraum definiert ist.Sie müssten es deklarieren als:
Jedes Mal, wenn Sie sich auf
Foo
beziehen wollen, müssen Sie es immer alsstruct Foo
bezeichnen. Das wird schnell lästig, also kann man eintypedef
hinzufügen:Jetzt verweisen
struct Foo
(im Tag-Namensraum) und einfach nurFoo
(im gewöhnlichen Bezeichner-Namensraum) beide auf dasselbe, und Sie können Objekte vom TypFoo
ohne das Schlüsselwortstruct
deklarieren.Das Konstrukt:
ist nur eine Abkürzung für die Deklaration und
typedef
.Endlich,
eine anonyme Struktur deklariert und ein
typedef
für sie erstellt. Mit diesem Konstrukt hat sie also keinen Namen im Tag-Namensraum, sondern nur einen Namen im Typedef-Namensraum. Das bedeutet, dass es auch nicht weiterdeklariert werden kann. Wenn Sie eine Vorwärtsdeklaration machen wollen, müssen Sie ihm einen Namen im Tag-Namensraum geben.In C++ verhalten sich alle
struct
/union
/enum
/class
-Deklarationen so, als wären sie implizittypedef
'ed, solange der Name nicht durch eine andere Deklaration mit demselben Namen verdeckt wird. Siehe Michael Burr's Antwort für die vollständigen Details.Es gibt einen Unterschied, aber einen subtilen. Sehen Sie es so:
struct Foo
führt einen neuen Typ ein. Die zweite erzeugt einen Alias namens Foo (und nicht einen neuen Typ) für einen unbenanntenstruct
-Typ.Ein typedef wird also immer als Platzhalter/Synonym für einen anderen Typ verwendet.
Es gibt keinen Unterschied in C++, aber ich glaube, in C würde es Ihnen erlauben, Instanzen der Struktur Foo zu deklarieren, ohne dies explizit zu tun: