Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C] Typdefinition für struct



Boron
08-12-2004, 14:00
Hallo zusammen,

irgendwie will ich nicht so richtig begreifen, wie ich in C (nicht C++!) eine korrekte Typdefinition für einen struct schreibe.

typedef struct Foo
{
int a;
} Foo;oder
typedef struct
{
int a;
} Foo;Im oberen Fall habe ich zweimal Foo stehen, aber nur das untere ist notwendig (wenn ich das untere weglasse, dann hagelt es 1000 Fehler vom Compiler).

Wenn ich das obere Foo weglasse, dann funktioniert auch alles wunderbar, aber warum kann ich das obere weglassen?
Welche Bedeutung hat denn das obere Foo?
Welche Bedeutung hat das untere Foo?

wraith
08-12-2004, 14:21
In C besteht ein vollständiger Strukturname aus struct + einem struct-Tag.


struct Foo
{
int i;
};
/* Instanz anlegen */
struct Foo bar;
/ * Das geht nicht */
Foo bar;

Der vollständige Name ist also wirklich struct Foo (und nicht nur Foo, wie in C++).
Um sich also die 'Arbeit' zu ersparen immer struct Foo schreiben zu müssen, kann man sich einen typedef definieren.


typedef struct Foo Foo;

Was jetzt möglich ist, ist das hier


struct Foo foo;
Foo bar;

Beide Zeilen legen ein struct Foo an, einmal über ein typedef.

'Problem': Man will nicht das auch die erste Variante geht.
Also legt man sich eine Tag-Lose Struktur an


struct
{
int i;
};

Dumm nur, das man jetzt nicht mehr auf das struct zugreifen kann, um darauf seinen typedef loszulassen.
Also machen wir die Tag-Lose Strukturdefinition 'im' typedef, so:


typedef struct { int i; } Foo;
/* so fällt die Ähnlichkeit eher auf mit folgendem */
typedef unsigned int uint; /* Lass' jetzt hier mal uint weg */

Jetzt ist nur noch Foo bar; möglich.
Wenn du hier wieder das Foo hinter struct einfügst, bist du wieder am Anfang.

Boron
08-12-2004, 14:57
Hm, ja, OK.
*nachdenk*
Ja, das passt und hilft weiter.

Vielen Dank :).