Frage zu struct

Gast #4762527
Hallo,

ich habe ein paar unterschiedliche C-Strukturen vorliegen.

In manchen Beispielen ist nach dem typedef struct "Nichts" stehend und 
in manchen wird noch ein Name (MeinStruct) angefügt. Wo ist der 
Unterschied in beiden Varianten?

typedef struct MeinStruct
{
uint8_t     var1;
uint8_t      var2;
}NameX;


typedef struct
{
uint8_t     var1;
uint8_t      var2;
}NameY;
Gast #4762556
Bitte beachte eines:
1
struct name
2
{ member1;
3
  member2;
4
  ...
5
  member_n;
6
};
ist die eigentliche Definition eines Struct's.

Das typedef Statement kann nichts anderes, als einem vorhandenen 
Datentyp einen zusätzlichen Namen geben.
Also so etwa
typedef unsigned long uint32_t;
Ab da kann man für einen unsigned long eben auch uint32_t hinschreiben.

Es gibt eine Krötigkeit in C, dahingehend, daß man als Ausgangstyp bei 
typedef auch einen just ad hoc und völlig namenlos kreierten Datentyp 
hinschreiben kann. Aber das ist eben eine Krötigkeit, über die man gern 
stolpert, weil man den soeben neu benamsten Typ innerhalb dieses typs 
nicht referenzieren kann. Ein schönes Beispiel sind verlinkte Listen, wo 
innerhalb eines Elementes zwei Verweise auf die gleichartigen 
Nachbar-kettenglieder nötig sind. Also
1
stuct kettenglied
2
{ struct kettenglied* davor;
3
  struct kettenglied* danach;
4
  int Nutzinhalt;
5
};

Deshalb schreib deine struct's besser immer auf die Art, die ich dir 
hingeschrieben habe. Wenn du dann immer noch da ein typedef draufsatteln 
willst, kannst du das anschließend tun.

W.S.
#4762577
1
typedef struct MeinStruct {
2
  uint8_t var1;
3
  uint8_t var2;
4
} NameX;

Das macht einen struct type MeinStruct und ein typ alias NameX. Um 
struct MeinStruct zu verwenden kann man das struct vor MeinStruct nicht 
weglassen. Bei NameX braucht man kein struct davor. Beispiel:
1
struct MeinStruct var1;
2
NameX var2;

Wenn man aber sowas hat:
1
typedef struct {
2
  uint8_t var1;
3
  uint8_t var2;
4
} NameY;

Dann hat das struct keinen namen. Es ist ein anonymes struct. NameY ist 
dann immernoch ein Alias für dieses anonyme struct, aber Fehlermeldungen 
werden je nach Compiler etwas weniger aussagekräftig.
Gast #4763068
Noch eine kurze Frage:

Kann ich auf diese Weise drei Structs für die Farben Rot, Blau, Grün 
erzeugen?

struct LEDstruct
{
  uint8_t     var_1;
  uint8_t     var_2;
  uint8_t     var_3;
}LEDrot, LEDblau, LEDgruen;


oder ist es besser, das als



typedef struct LEDstruct
{
  uint8_t     var_1;
  uint8_t     var_2;
  uint8_t     var_3;
}

LEDstruct LEDrot;
LEDstruct LEDblau;
LEDstruct LEDgruen;

zua machen?
#4763145
Struktus schrieb:
> Kann ich auf diese Weise drei Structs für die Farben Rot, Blau, Grün
> erzeugen?

Ja, du kannst auf diese weise 3 Variablen vom typ struct LEDstruct 
erstellen.


> oder ist es besser, das als
>
> typedef struct LEDstruct
> {
>   uint8_t     var_1;
>   uint8_t     var_2;
>   uint8_t     var_3;
> }

Da fehlt ein Semikolon, und das Typedef ist wirkungslos.

> LEDstruct LEDrot;
> LEDstruct LEDblau;
> LEDstruct LEDgruen;

Müsste "struct LEDstruct LEDrot;" sein, das andere geht nur in C++. 
Eventuell amcht es sinn das so zu schreiben, dan würde es in C uns C++ 
gehen:
1
typedef struct LEDstruct
2
{
3
  uint8_t     var_1;
4
  uint8_t     var_2;
5
  uint8_t     var_3;
6
} LEDstruct;

Typedef sorgt immer nur dafür, das keine Variable, sondern ein Datentyp 
definiert wird. Gibt es ohne typedef keine Variable, die definiert 
würde, macht der Ausdruck mit typedef dafor keinen Sinn.

Die zweite Variante ist trotzdem besser, weil man eine Struktdefinition 
meist in mehreren Dateien braucht, und deshalb haufig in header 
auslagert. Variablen sollten nicht in Headern definiert werden, und 
deshalb macht es oft sinn das zu trennen.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 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.