Forum: Compiler & IDEs struct ohne typedef


von Michl (Gast)


Lesenswert?

Ich hab hier eine kurze und hoffentlich schmerzlose Frage:

Welchen Sinn hat es, eine struct ohne typedef anzulegen?

Beispiel:
1
struct my_struct{
2
//member 1
3
//member 2
4
}
5
6
struct my_struct var;

Ich muss bei einer Variablendefinition immer ein struct davorsetzen.

Dagegen:
1
typedef struct{
2
//member 1
3
//member 2
4
} my_struct_t;
5
6
my_struct_t var;

Haben diese beiden Methoden irgendwelche Vor- oder Nachteile?

von radiostar (Gast)


Lesenswert?

Michl schrieb:
> Ich muss bei einer Variablendefinition immer ein struct davorsetzen.

Wieso müssen? Das hat sogar den Vorteil, daß man im Quelltext immer 
wieder dran erinnert wird, daß dies ein struct ist.

von (prx) A. K. (prx)


Lesenswert?

Michl schrieb:
> Welchen Sinn hat es, eine struct ohne typedef anzulegen?

Typedefs existierten in der ersten Sprachfassung (pre-K&R) noch nicht. 
Was man auch heute noch merkt, denn typdefs passen sich nicht gut in die 
Grammatik der Sprache ein.

von Karl H. (kbuchegg)


Lesenswert?

Das ist das eine.
Das andere ist tatsächlich die ur-ur-ursprüngliche Idee, dass sich der 
Programmierer daran erinnern soll, es mit einer struct zu tun zu haben.

Das ist eine der Ideen, von der man heute sagen muss: War nicht die 
beste Idee, die K&R hatten.

Deshalb hat Stroustroup dann auch das ganze kurzerhand geändert. In C++ 
ist der Name einer struct automatisch ein Type-Alias, so dass man dort 
den ganzen typedef Hack nicht mehr braucht.

von test (Gast)


Lesenswert?

Rein praktisch gesehen brauchst du es spätestens bei sowas:
1
typedef struct {
2
//...
3
    list_node_t* prev;
4
    list_node_t* next;
5
} list_node_t;
Das geht nämlich nicht.

-->
1
typedef struct _list_node {
2
//...
3
    struct _list_node* prev;
4
    struct _list_node* next;
5
} list_node_t;

Ich will mich aber nicht verbürgen ob das in C99 nicht doch schon geht, 
aber ich glaube nicht.

von Simon H. (simi)


Lesenswert?

Karl Heinz Buchegger schrieb:

> Deshalb hat Stroustroup dann auch das ganze kurzerhand geändert. In C++
> ist der Name einer struct automatisch ein Type-Alias, so dass man dort
> den ganzen typedef Hack nicht mehr braucht.

Lustig! Vor allem, dass das zumindest mir nicht wirklich bekannt war, 
obwohl einem im Fall von class statt struct nie in den Sinn käme, ein 
typedef zu verwenden! :-) Zumal class und struct (fast) genau dasselbe 
sind.

Und dennoch sitzt auch in C++ (bei mir) der Automatismus mit dem typedef 
tief. :-) Aber nur bei struct, nie bei class...

Gruäss
Simon

von (prx) A. K. (prx)


Lesenswert?

test schrieb:
> Rein praktisch gesehen brauchst du es spätestens bei sowas:

Für jene, die sich nicht derart verrenken wollen, gehts auch so:
1
typedef struct list_node list_node_t;
2
struct list_node {
3
    list_node_t* prev;
4
    list_node_t* next;
5
};

von (prx) A. K. (prx)


Lesenswert?

Man kann das auch per Makro grob analog zu C++ gestalten:
1
#define STRUCT(t) typedef struct t t; struct t
2
3
STRUCT(list_node_t)
4
{
5
        list_node_t *prev;
6
        list_node_t *next;
7
};

von Cyblord -. (cyblord)


Lesenswert?

> Zumal class und struct (fast) genau dasselbe
> sind.

Oh oh da machst du dir aber bei OO-Fraktion keine Freunde. Eine Klasse 
ist doch wohl EINIGES mehr als nur ein zusammengesetzter Datentyp. So 
Nebensächlichkeiten wie Polymorphie, Vereerbung und Kapselung (versuch 
mal bei einem Struct eine Invariante aufrechtzuerhalten) gibts ja auch 
noch.

gruß cyblord

von Simon H. (simi)


Lesenswert?

cyblord ---- schrieb:
> Eine Klasse
> ist doch wohl EINIGES mehr als nur ein zusammengesetzter Datentyp.

Eine Struct auch ;-)
(wenn man will)

Der einzige Unterschied zwischen struct und class ist, dass bei ersterer 
per default alles public ist, bei zweiterer alles private.


cyblord ---- schrieb:
> (versuch
> mal bei einem Struct eine Invariante aufrechtzuerhalten)

Ganz einfach: Ich schreibe eine Klasse nach Schulbuch und ersetze 
"class" durch "struct". :-P

von Maximilian (Gast)


Lesenswert?

Michl schrieb:

> Dagegen:typedef struct{
> //member 1
> //member 2
> } my_struct_t;
>
> my_struct_t var;
>
> Haben diese beiden Methoden irgendwelche Vor- oder Nachteile?

seufz

Das "Dagegen" wäre korrekterweise:

typedef struct my_struct_t{
//member 1
//member 2
} my_struct_t;

Du hast da oben nämlich nicht nur ein typedef eingeführt, sondern auch 
die struct anonymisiert. Und das ist böse!

Denn dann hast du in größeren Projekten ratz-fatz extreme Buildzeiten, 
weil keine forward declarations mehr gehen und du jeden 
Riesen-Rotz-Header unnötigerweise einbinden mußt.

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.