KurtWatzka antwortet auf eine Frage von Christian Rohrbach in news:de.comp.lang.c, Mittwoch 20.6.2001, "Re: Unterschied typedef-struct" (mit seinem Einverständnis hier zitiert) -- HelmutLeitner
Frage |
Ich habe hier ein C-Buch für Anfänger in dem steht leider nichts über typedef sondern immer nur was über struct. Wo ist da eigentlich der wesentliche Unterschied?
Antwort |
Der wesentliche Unterschied ist wohl, dass die beiden nur wenig miteinander zu tun haben. typedef führt einen alternativen Namen für einen Typ ein, es hat mit der Definition von benutzerdefinierten Typen gar nichts zu tun. struct ist ein zusammengesetzer Typ, der Komponenten verschiedenen Typs zusammenfassen kann.
Wenn ein Programm viele Arrays von 5 Zeigern auf char brauchen wird, und wenn das nicht jedesmal als
|
geschrieben werden soll, dann kann ein Alias für den Typ Array von 5 Zeigern auf char mit typedef eingeführt werden, beispielsweise mit dem Namen ENTRYTABLE. Dieses Alias wird dann bei der Definition von l und m zu verwenden.
|
Durch typedef wird eben gerade kein Typ eingeführt, sondern immer nur ein Name für einen bereits bestehenden Typ.
Wenn in einem Programm ein Name (mit maximal 30 Zeichen) und ein Wert gemeinsam eine logische Einheit bilden, dann können (und sollten) sie zu einem Typ zusammengesetzt werden:
|
Die Variable c hat nun den Typ (anonyme) struct aus einem Array von 30 char und einem int und die Komponenten können mit c.Name und c.Wert angesprochen werden. Hier wurde ein neuer, benutzerdefinierter Typ eingeführt, und die Variable c ist von diesem Typ.
Wenn so ein zusammengesetzter Typ mehr als einmal verwendet wird, dann hat es Sinn, dem zusammengesetzten Typ einen Namen zu geben:
|
Hier wurde nun keine Variable definiert, sondern ein benutzerdefinierter Typ mit dem Namen struct BENANNTER_WERT eingeführt. Dieser Typ kann bei der Definition einer Variablen verwendet werden:
|
d hat den Typ struct BENANNTER_WERT. Die Komponenten von d sind mit d.Name und d.Wert ansprechbar.
Mit typedef kann auch fuer den Typ struct BENANNTER_WERT ein anderer Name eingeführt werden, etwa der Name benannterWert:
|
Weil der Name benannterWert nur ein anderer Name für den Typ struct BENANNTER_WERT ist, sind im folgenden Beispiel die Variablen e und f vom gleichen Typ;
|
Weil e und f vom gleichen Typ sind, ist auch eine Zuweisung von einem benannterWert and eine struct BENANNTER_WERT wie
|
erlaubt.
Dabei kann der mit typedef eingeführte alternative Name für struct BENANNTER_WERT auch einfach BENANNTER_WERT sein, weil Namen von zusammengesetzen struct-Typen und die mit typedef vergebenen alternativen Namen nicht in einem Namensraum liegen:
|
ist ebenfalls möglich.
Das ganze kann auch noch zu einer Deklaration zusammengefasst werden, bei der der Typ eingeführt wird und gleichzeitig auch noch ein alternativer Name für diesen Typ:
|
Der Typ, fuer den ein alternativer Name eingeführt wird, darf dabei auch ein anonymer struct-Typ sein:
|
Vielen Dank an KurtWatzka für die Original-Antwort.