struct ohne typedef

Gast #2784046
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?
#2784154
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.
Gast #2784164
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.
#2784461
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
#2784636
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
#2784655
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
Gast #2784875
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.

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