Cee Frage Typedef Und Struct
 
StartSeite | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern

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

  char *l[5];
  char *m[5];

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.

  typedef char *ENTRYTABLE[5];
  ENTRYTABLE l;
  ENTRYTABLE m;

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:

  struct
  {
     char Name[30];
     int Wert;
  } c;

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:

  struct BENNANNTER_¦WERT
  {
     char Name[30];
     int Wert;     
  };

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:

  struct BENANNTER_¦WERT d;

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:

  typedef struct BENANNTER_¦WERT 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;

  struct BENANNTER_¦WERT e;
  benannterWert f;

Weil e und f vom gleichen Typ sind, ist auch eine Zuweisung von einem benannterWert and eine struct BENANNTER_WERT wie

  e = f;

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:

  typedef struct BENANNTER_¦WERT BENANNTER_¦WERT;

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:

  typedef struct NUMMERIERTER_¦WERT
  {
     unsigned int Nummer;
     int Wert;
  } NUMMERIERTER_¦WERT;

Der Typ, fuer den ein alternativer Name eingeführt wird, darf dabei auch ein anonymer struct-Typ sein:

  typedef struct { int Erster; int Zweiter } WERTE_¦PAAR;


Vielen Dank an KurtWatzka für die Original-Antwort.


KategorieC KategorieCee
StartSeite | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern
Text dieser Seite ändern (zuletzt geändert: 29. November 2007 8:27 (diff))
Suchbegriff: gesucht wird
im Titel
im Text