Typedef mit Pointer auf den eigenen Typ

Gast #3992761
Lesenswert?
• ▲
▼
Guten Morgen,

ich möchte in der Struktur eines typedefs einen Pointer auf diesen Typ 
deklarieren. Ist sowas möglich?
1
typedef struct
2
{
3
int var1;
4
int var2;
5
t_MyType *myType;
6
} t_MyType;

Wenn ich das Problem des Compilers richtig verstehe, kennt er den Typ 
t_MyType ja erst, wenn die Struktur / der Typ definiert, oder wenigstens 
deklariert wurde.

Ich habe es auch versucht, einfach auf die Struktur zu zeigen:

1
typedef struct s_MyType
2
{
3
int var1;
4
int var2;
5
s_MyType *myType;
6
} t_MyType;


... oder bereits vor der Definition den typedef zu deklarieren:

1
typedef t_MyType;
2

3
typedef struct
4
{
5
int var1;
6
int var2;
7
t_MyType *myType;
8
} t_MyType;


Immer meckert der Compiler mit mir.


Weiß jemand ob, und wenn ja wie so etwas möglich ist?

Vielen Dank für Eure Hilfe!
Gast #3992771
Lesenswert?
• ▲
▼
C Programmierer schrieb:
> typedef struct
> {
> int var1;
> int var2;
> t_MyType *myType;
> } t_MyType;
>
> Wenn ich das Problem des Compilers richtig verstehe, kennt er den Typ
> t_MyType ja erst, wenn die Struktur / der Typ definiert, oder wenigstens
> deklariert wurde.

Du siehst gerade, warum die Unsitte, anonyme Strukturen zu verwenden, 
nicht so clever ist: man kann keine forward declarations erstellen.

> typedef struct s_MyType
> {
> int var1;
> int var2;
> s_MyType *myType;
> } t_MyType;

Es gibt ja auch keinen Typ "s_MyType". Der Typ lautet "struct s_MyType".

> typedef t_MyType;

Syntaxfehler: typedef <alt> <neu>

Wo ist <neu>?
Gast #3992782
Lesenswert?
• ▲
▼
C Programmierer schrieb:
> Ich habe es auch versucht, einfach auf die Struktur zu zeigen:
>
> typedef struct s_MyType
> {
> int var1;
> int var2;
> s_MyType *myType;
> } t_MyType;

Da s_MyType  eine struct ist, musst du es (in C) auch angeben.
1
typedef struct s_MyType
2
{
3
  int var1;
4
  int var2;
5
  struct s_MyType *myType;
6
} t_MyType;
#3992785
Lesenswert?
• ▲
▼
C Programmierer schrieb:
> ... oder bereits vor der Definition den typedef zu deklarieren:

Fast richtig. Unvollständige Deklarationen sind zulässig, aber ganz leer 
dürfen sie nicht sein, sonst scheitert die Syntax. So geht es aber:
1
typedef struct s_MyType t_MyType;
2

3
struct s_MyType
4
{
5
 int var1;
6
 int var2;
7
 t_MyType *myType;
8
};
Man darf hier auch den gleichen Namen verwenden, da structs und typedefs 
in C getrennte Namespaces verwenden:
1
typedef struct MyType MyType;
2

3
struct MyType
4
{
5
 int var1;
6
 int var2;
7
 MyType *myType;
8
};
Gast #4002041
Lesenswert?
• ▲
▼
Hallo nochmal!

Ich möchte die structs und typedefs jetzt in verschiedene Headerdateien 
aufteilen. Dabei bindet Header A Header B ein und umgekehrt. Dabei 
bekomme ich jedoch eine Fehlermeldung, dass eine Struktur nicht 
definiert wäre.


Jetzt habe ich das testweise nochmal in eine Headerdatei gepackt: Nur 
wenn ich die richtige Reihenfolge bei der Definition anwende 
funktioniert das ganze:
1
// Keine Fehlermeldung:
2

3

4
// Header A
5
typedef struct sAa
6
{
7
  struct sB *b;
8
} tAa;
9

10
typedef struct sAb
11
{
12
  struct sAa *aa;
13
} tAb;
14

15
// Header B
16
typedef struct sB
17
{
18
  struct sAa *aa;
19
  struct sAb ab;
20
} tB;

1
// Fehlermeldung: "error C2079: 'ab' verwendet undefiniertes struct 'sAb'"
2

3

4
// Header B
5
typedef struct sB
6
{
7
  struct sAa *aa;
8
  struct sAb ab;
9
} tB;
10

11
// Header A
12
typedef struct sAa
13
{
14
  struct sB *b;
15
} tAa;
16

17
typedef struct sAb
18
{
19
  struct sAa *aa;
20
} tAb;


Es scheint nicht möglich zu sein, die Strukturen in die Header A und B 
aufzuteilen. Was mache ich falsch? Ist das wirklich nicht möglich? Kann 
mir jemand diese Fehlermeldung erklären?
Gast #4002595
Lesenswert?
• ▲
▼
C Programmierer schrieb:
> Es scheint nicht möglich zu sein, die Strukturen in die Header A und B
> aufzuteilen. Was mache ich falsch? Ist das wirklich nicht möglich? Kann
> mir jemand diese Fehlermeldung erklären?

Doch, es ist möglich, solange Pointer im Spiel sind. Das magische Wort 
lautet "Forward Declaration".
1
// Header A
2

3
struct B;   // forward declaration
4

5
struct A {
6
   struct B* b;   // muss ein Pointer sein
7
};
1
// Header B
2

3
struct A;   // forward declaration
4

5
struct B {
6
   struct A* a;   // muss ein Pointer sein
7
};
1
// Implementierung A
2
#include "A"
3
#include "B"
4

5
// tu was sinnvolles
1
// Implementierung B
2
#include "B"
3
#include "A"
4

5
// tu was sinnvolles

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