Opaque Pointer in C

Gast #4297720
Lesenswert?
• ▲
▼
Hallo,

ich habe ein kleines Problem in C.
in der Struktur T_Car1 habe ich den Opaque Pointer car2.
Allerdings bekomme ich die Fehlermeldung: unknown type name 'T_Car2'
Wie kann das sein? An dieser Stelle muss der Compiler die Größe von
T_Car2 nicht kennen. Es handelt sich ja um einen Pointer und dessen 
Größe ist ja bekannt. Trotzdem mekkert der Compiler. Wer kann helfen
Danke.

1
typedef struct
2
{
3
    int test1;
4
    int test2;
5
    T_Car2* car2;
6
}T_Car1;
7

8

9
typedef struct
10
{
11
    int test1;
12
    int test2;
13
    T_Car1 car1;
14
}T_Car2;
Gast #4297767
Lesenswert?
• ▲
▼
Sebi schrieb:
> Leider funktioniert eine foreward declaration struct T_Car2; nicht. An
> was kann das liegen?

ich würde denke, das die Struct keine namen hat.

1
struct Car1T;
2
struct Car2T;
3

4
struct Car1T
5
{
6
    int test1;
7
    int test2;
8
    T_Car2* car2;
9
};
10

11
struct Car2T
12
{
13
    int test1;
14
    int test2;
15
    T_Car1 car1;
16
}
sollte für c++ reichen, wenn es noch c ist, dann das typedef noch machen
1
typedef struct Car1T; T_Car1;
2
typedef struct Car2T; T_Car2;
Gast #4297976
Lesenswert?
• ▲
▼
A. K. schrieb:
> typedef struct T_Car1
> {
>     int test1;
>     int test2;
>     struct T_Car2* car2;
> }T_Car1;
>
> typedef struct T_Car2
> {
>     int test1;
>     int test2;
>     T_Car1 car1;
> }T_Car2;

Danke. Das funktioniert.
Und das: struct T_Car2* car2; ist jetzt also der opaque pointer.
#4298273
Lesenswert?
• ▲
▼
Sebi schrieb:
> Und das: struct T_Car2* car2; ist jetzt also der opaque pointer.

Wäre es, wenn du nicht wüsstest, worauf er zeigt.
Das ist bei dir aber eigentlich ja nur der Fall, wenn du den Bildschirm 
ausschaltest.

Genau genommen ist er es höchstens insofern, als der Compiler es bei der 
ersten Verwendung noch nicht weiß (sondern erst kurz danach).
#4298302
Lesenswert?
• ▲
▼
Was Klaus sagen möchte ist, dass das es bei dem Problem gar nicht um 
einen Opaque Pointer geht, weil T_Car2 nicht nur (vorwärts) Deklariert, 
sondern auch definiert wird.

Nur wenn die Definition von T_Car2 vom normalen Verwender des Codes 
verborgen wäre würde es sich um einen Opaque Pointer für den Verwender 
des Codes handeln.

Das ist einfache eine Forward Reference, also eine Referenz auf einen 
Typen der erst später definiert wird. In C löst man eine Forward 
Reference mit einer Forward Declaration auf. Die Forward Declaration ist 
in diesem Fall die Deklaration eines Incomplete Types.

Die Definition eines Incomplete Types ist einfach, ein Typ dessen Größe 
momentan nicht bekannt ist. Incomplete Types gibt es nur bei structs, 
unions und Arrays und mit void. Andere Datentypen kann man nur 
vollständig deklarieren.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren