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;
Erste Variante deklariert struct MeinStruct und einen Alias dafür. Zweite Variante deklariert nur den Alias mit Hilfe eines anonymen struct.
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.
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.
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.
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.