Frage zu struct

Gast #4762527
Lesenswert?

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

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

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

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

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

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