Forum: PC-Programmierung Typedef mit Pointer auf den eigenen Typ


von C Programmierer (Gast)


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!

von test (Gast)


Lesenswert?

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

von test (Gast)


Lesenswert?

Argh, zu schnell:
1
typedef struct s_MyType t_MyType;
2
3
struct s_MyType
4
{
5
int var1;
6
int var2;
7
struct s_MyType* myType;
8
};

von Freddie (Gast)


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>?

von DirkB (Gast)


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;

von (prx) A. K. (prx)


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
};

: Bearbeitet durch User
von C Programmierer (Gast)


Lesenswert?

Super!

Vielen Dank an Euch alle!

von C Programmierer (Gast)


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?

von (prx) A. K. (prx)


Lesenswert?

Die Verwendung unvollständiger Strukturdeklarationen ist nur bei 
Pointern zulässig. Auf aa trifft das zu, nicht aber auf ab. Hintergrund: 
Bei Pointern kennt der Compiler auch ohne vollständigem Typ deren 
Grösse.

von Freddie (Gast)


Lesenswert?

Erwähnte ich schonmal, daß anonyme Strukturen einfach eine blöde Idee 
sind?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Freddie schrieb:
> Erwähnte ich schonmal, daß anonyme Strukturen einfach eine blöde Idee
> sind?

Und wo siehst Du hier welche?

von Rolf M. (rmagnus)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Freddie schrieb:
>> Erwähnte ich schonmal, daß anonyme Strukturen einfach eine blöde Idee
>> sind?
>
> Und wo siehst Du hier welche?

Gleich die allererste, aus der das hier diskutierte Problem entstanden 
ist:

C Programmierer schrieb:
> typedef struct
> {
> int var1;
> int var2;
> t_MyType *myType;
> } t_MyType;

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Ah. Ich nahm an, daß er sich auf den letzten geposteten Code bezog, also 
was sinnvolles zur Diskussion beitragen wollte.

von tictactoe (Gast)


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

von C Programmierer (Gast)


Lesenswert?

In diesem Beispiel ist aber kein Pointer im Spiel. Ich werde dann 
einfach alles in eine Headerdatei packen.

Danke für Eure Hilfe!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.