struct ohne typedef

Gast #2784046
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?
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
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.
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
> 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
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
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

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.