Zunächst mal musst du die Dinge trennen.
typedef hat nichts mit enum oder struct oder union per se zu tun.
Wie ist die Sache in C.
Du vereinbarst eine struct
1 | struct Koordinaten
|
2 | {
|
3 | double x;
|
4 | double y;
|
5 | };
|
gut.
Damit kannst du Variablen definieren, oder zb eine derartige Variable an
eine Funktion übergeben
1 | void foo( struct Koordinaten Punkt )
|
2 | {
|
3 | printf( "%f, %f\n", Punkt.x, Punkt.y );
|
4 | }
|
5 |
|
6 | int main()
|
7 | {
|
8 | struct Koordinaten Center;
|
9 |
|
10 | Center.x = 5;
|
11 | Center.y = 8;
|
12 |
|
13 | foo( Center );
|
14 | }
|
soweit so gut.
Man kann auch in C eine struct definieren und gleichzeitig Variablen von
diesem Typ anlegen
1 | struct Coord
|
2 | {
|
3 | double x;
|
4 | double y;
|
5 | } Center, CircumPoint, A, B, C;
|
das vereinbart in einem Rutsch, dass Center, CircumPoint, A, B und C vom
Datentyp struct Coord sind und auch gleich noch, wie diese Struktur
aussieht.
Nun ist es aber so, dass in C der Name einer Struktur nicht automatisch
der Name eines neuen Datentyps ist. Man muss also immer das struct mit
dazu schreiben.
1 | ...
|
2 | void foo( struct Koordinaten Punkt )
|
3 | ...
|
4 | struct Koordinaten Center;
|
5 | ...
|
und das kann dann ein wenig lästig sein.
An dieser Stelle betritt der typedef die Bühne.
Ein typedef schafft einen neuen Namen für einen Datentypen. Seine
Anwendung ist ganz einfach: Schreib eine Variablendefinition hin, mach
ein typedef davor und der Name der Variablen wird zum Namen dieses
'neuen' Datentyps.
Das vereinbart also einen neuen Datentypen, der grundsätzlich ein double
ist und fortan unter dem Namen 'Real' bekannt sein soll. Du kannst den
benutzen, wie jeden anderen Datentypen
1 | int main()
|
2 | {
|
3 | Real x, y;
|
4 | }
|
x und y sind vom Datentyp Real, welcher nichts anderes als ein anderer
Name für double ist.
1 | typedef char Hollodrio[40];
|
Hollodrio ist der neue Datentyp und er ist ein Array der Länge 40 von
Charcatern.
1 | int main()
|
2 | {
|
3 | Hollodrio myString;
|
4 | }
|
folgerichtig ist daher myString so ein Array von 40 Charactern.
Und jetzt zählen wir mal 2 und 2 zusammen
du hast eine Struktur
1 | struct Koordinaten
|
2 | {
|
3 | double x;
|
4 | double y;
|
5 | };
|
und du hast einen typedef dafür
1 | typedef struct Koordinaten Koord;
|
dann ist Koord ein anderer Name für den Datentyp 'struct Koordinaten'.
Anstelle der langen Form von ganz oben, kannst du daher auch schreiben:
1 | void foo( Koord Punkt )
|
2 | {
|
3 | printf( "%f, %f\n", Punkt.x, Punkt.y );
|
4 | }
|
5 |
|
6 | int main()
|
7 | {
|
8 | Koord Center;
|
9 |
|
10 | Center.x = 5;
|
11 | Center.y = 8;
|
12 |
|
13 | foo( Center );
|
14 | }
|
ist genau dasselbe. Der typedef hat dafür gesorgt, dass nach ihm 'Koord'
dasselbe ist wie 'struct Koordinaten'.
Bei einem typedef muss aber die Struktur noch nicht existieren. Du
kannst ja auch Strukturdefinition und Variablen in einem Aufwasch
definieren, wie weiter oben schon gezeigt.
Und da ein typedef sich an die Definition von Variablen hält, geht
natürlich auch
1 | typedef
|
2 | struct Koordinaten
|
3 | {
|
4 | double x;
|
5 | double y;
|
6 | } Koord;
|
ist genau dasselbe, nur in einem Aufwasch geschrieben. Koord wird als
neuer Datentyp eingeführt und der Datentyp für den er steht (die
Struktur) wird im typedef selber auch gleich definiert.
Tja. Und zu guter letzt gibt es noch einen Sonderfall, nämlich den, dass
eine Struktur auch anonym sein kann, also keinen Strukturnamen benötigt
1 | struct
|
2 | {
|
3 | double x;
|
4 | doubly y;
|
5 | } Center, CircumPoint, A, B, C;
|
vereinbart 5 Variablen, die diesen Aufbau haben ohne dafür dem Datentyp
einen extra Namen zu geben.
Das wiederrum in den typedef integriert ergibt
1 | typedef
|
2 | struct
|
3 | {
|
4 | double x;
|
5 | double y;
|
6 | } Koord;
|
und wir sind bei der Form, die du angetroffen hast.
Hat denn dein C-Buch dazu überhaupt nichts zu sagen? Normalerweise ist
das was ich hier in Kurzform und dicht gedrängt erzählt habe etwas, was
sich über mehrere Kapitel hinzieht und dort langsam und behutsam mit
allen Sonderformen eingeführt wird.
Oder hast du gar kein C-Buch?