Forum: Mikrocontroller und Digitale Elektronik Frage zu struct


von Struktus (Gast)


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;

von Wilhelm M. (wimalopaan)


Lesenswert?

Erste Variante deklariert struct MeinStruct und einen Alias dafür.

Zweite Variante deklariert nur den Alias mit Hilfe eines anonymen 
struct.

von W.S. (Gast)


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.

von Daniel A. (daniel-a)


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.

von Structschüler (Gast)


Lesenswert?

W.S. schrieb:
> ist die eigentliche Definition eines Struct's.

... und wer hier mit Apostrophen um sich wirft sollte mal bei

http://www.deppenapostroph.info/

vorbeischauen. Sehr informativ.

von Struktus (Gast)


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?

von Daniel A. (daniel-a)


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.

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.