Hi,
1 | struct X { ...; };
|
2 | typedef struct { ...; } Y;
|
3 | typedef struct X Z;
|
die erste Zeile definiert einen Strukturtyp mit dem Namen "struct X"
(das Schlüsselwort 'struct' ist Bestandteil des Namens). Die zweite
Zeile definiert einen Alias "Y" für einen anonymen Strukturtyp. Und die
dritte Zeile definiert einen Alias "Z" für für den vorher definierten
Strukturtyp 'struct X'.
Variablen vom entsprechenden Typ werden so angelegt:
1 | struct X s1;
|
2 | Y s2;
|
3 | Z s3;
|
In C++ (nicht aber in C!) ginge auch:
Was die Kontstruktion
1 | struct fat16_file_struct;
|
im Header angeht. Hier gibt man dem Compiler nur bekannt, daß es einen
entsprechenden Strukturtyp gib, NICHT aber wie dieser aussieht. Man kann
diesen dann z.B. dazu verwenden um einen Zeiger darauf zu erzeugen,
nicht aber eine Variable des Typs selbst (dafür müßte die Größe der
Struktur bekannt sein). Zeigerarithmetik geht deshalb auch nicht. Und
man kann natürlich auch nicht auf irgentwelche Elemente der Struktur
zugreifen (woher soll der Compiler schließlich wissen, welche es
überhaupt gibt)
1 | struct fat16_file_struct* fd = NULL; // das ist OK
|
2 | struct fat16_file_struct fd2; // "error: storage size of 'fd2' isn't known"
|
3 | fd++; // "error: increment of pointer to unknown structure"
|
4 | // "error: arithmetic on pointer to an incomplete type"
|
5 | fd->foo = 0; // "error: dereferencing pointer to incomplete type"
|
Brauchen tut man sowas z.B., wenn zwei Strukturen Zeiger auf die jeweils
andere enthalten.
1 | struct B;
|
2 | struct A {
|
3 | struct B *pB;
|
4 | };
|
5 | struct B {
|
6 | struct A *pA;
|
7 | };
|
CU