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

Veränderung (letzte Änderung) (Korrektur, Autor, Normalansicht)

Verändert: 2c2
KurtWatzka in news:de.comp.lang.c, Mittwoch 20.6.2001, "Re: Unterschied typedef-struct", mit seinem Einverständnis hier zitiert. -- HelmutLeitner
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

Verändert: 6c6
Frage (Christian Rohrbach):
[[Überschrift]Frage]

Verändert: 8c8,10
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?
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?

Verändert: 12,27c14,32
Der wesentliche Unterschied ist wohl, dass beides nur wenig miteinander
zu tun hat. typedef fuehrt einen alternativen Namen fuer einen Typ ein,
es hat mit der Definition von benutzerdefinierten Typen gar nichts
zu tun. struct ist eine 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 *a[5];
char *b[5];

geschrieben werden soll, dann kann ein Alias fuer den Typ "Array von
5 Zeigern auf char", beispielsweise mit dem Namen ENTRYTABLE, mit
typedef eingefuehrt werden, um es dann bei der Definition von l und
m zu verwenden.
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

[[Code]
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.

Hinzugefügt: 28a34
[[Code]

Entfernt: 30d35


Hinzugefügt: 32a38
]

Verändert: 34,39c40,47
Durch typedef wird eben gerade _kein_ Typ eingefuehrt, sondern immer
nur ein Name fuer einen bereits bestehenden Typ.

Wenn in einem Programm ein Name (mit maximal 30 Zeichen) und ein Wert
gemeinsame eine logische Einheit bilden, dann koennen (und sollten)
sie zu einem zusammengesetzen Typ, nun, zusammengesetzt werden:
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:

Hinzugefügt: 40a49
[[Code]

Hinzugefügt: 45a55
]

Verändert: 47,50c57
Die Variable c hat nun den Typ (anonyme) struct aus einem Array von 30 char
und einem int, und die Komponenten koennen mit c.Name und c.Wert angesprochen
werden. Hier wurde ein neuer, benutzerdefinierter Typ eingefueht, und die
Variable c ist von diesem Typ;
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.

Verändert: 52,53c59
Wenn so ein zusammengesetzter Typ mehr als einmal verwendet wird, dann
hat es Sinn, dem zusammengesetzten Typ einen Namen zu geben:
Wenn so ein zusammengesetzter Typ mehr als einmal verwendet wird, dann hat es Sinn, dem zusammengesetzten Typ einen Namen zu geben:

Hinzugefügt: 54a61
[[Code]

Hinzugefügt: 59a67
]

Verändert: 61,63c69
Hier wurde nun keine Variable definiert, sondern ein benutzerdefinierter
Typ mit dem Namen "struct BENANNTER_WERT" eingefuehrt. Dieser Typ kann
bei der Definition einer Variablen verwendet werden:
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:

Hinzugefügt: 64a71
[[Code]

Hinzugefügt: 65a73
]

Verändert: 67,68c75
d hat den Typ "struct BENANNTER_WERT", d.h. die Komponenten von d sind
mit d.Name und d.Wert ansprechbar.
d hat den Typ struct BENANNTER_WERT. Die Komponenten von d sind mit d.Name und d.Wert ansprechbar.

Verändert: 70,71c77
Mit typedef kann auch fuer den Typ "struct BENANNTER_WERT" ein anderer
Name eingefuehrt werden, etwa der Name "benannterWert":
Mit typedef kann auch fuer den Typ struct BENANNTER_WERT ein anderer Name eingeführt werden, etwa der Name benannterWert:

Hinzugefügt: 72a79
[[Code]

Hinzugefügt: 73a81
]

Verändert: 75,77c83
Weil der Name "benannterWert" nur ein anderer Name fuer den Typ
"struct BENANNTER_WERT" ist, sind im folgenden Beispiel die
Variablen e und f vom gleichen Typ;
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;

Hinzugefügt: 78a85
[[Code]

Hinzugefügt: 80a88,95
]

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

[[Code]
e = f;
]

Verändert: 82,83c97,100
Dabei kann der mit typedef eingefuehrte alternative Name fuer
"struct BENANNTER_WERT" auch einfach "BENANNTER_WERT" sein, weil
erlaubt.

Dabei kann der mit typedef eingeführte alternative Name für
struct BENANNTER_WERT auch einfach BENANNTER_WERT sein, weil

Hinzugefügt: 86a104
[[Code]

Hinzugefügt: 87a106
]

Verändert: 89c108
ist also ebenfalls moeglich.
ist ebenfalls möglich.

Verändert: 91,93c110
Das ganze kann auch noch zu einer Deklaration zusammengefasst
werden, bei der der Typ eingefuehrt wird und gleichzeitig gleich
auch noch ein alternativer Name fuer diesen Typ:
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:

Hinzugefügt: 94a112
[[Code]

Hinzugefügt: 99a118
]

Verändert: 101,102c120
Der Typ, fuer den ein alternativer Name eingefuehrt wird, darf
dabei auch ein anonymer struct-Typ sein:
Der Typ, fuer den ein alternativer Name eingeführt wird, darf dabei auch ein anonymer struct-Typ sein:

Hinzugefügt: 103a122
[[Code]

Hinzugefügt: 104a124,126
]




Verändert: 106c128
-- KurtWatzka
Vielen Dank an KurtWatzka für die Original-Antwort.

Verändert: 109c131
KategorieCee
KategorieC KategorieCee

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