mikrocontroller.net

Forum: Compiler & IDEs verschachtelte typedef


Autor: Alexander G (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Abend!

Ich bin gerade auf das Problem gestoßen, dass mehrere typedef in ihrer 
Definition aufeinander beruhen und somit immer der erste typedef einen 
Fehler schmeißt, weil er die jeweils andere Definition noch nicht kennt.
typedef void (*S_midi_read_performed)(const S_midi_class *);

typedef struct {
  S_midi_packet_decoder decoder;
  S_midi_read_performed readPerformed;
  S_midi_write_performed writePerformed;
} S_midi_callbacks;

typedef struct {
  S_midi_buffer* rxBuffer;
  S_midi_buffer* txBuffer[2];
  S_midi_callbacks sCallbacks;
  unsigned char bTxEndpoint;
  unsigned char bRxEndpoint;
} S_midi;

typedef struct {
  S_std_class sStdClass;
  S_midi sMidi;

} S_midi_class;

Wie geht man denn da an die Sache ran?
Alexander

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wie geht man denn da an die Sache ran?

Indem man vor die Typedefs Vorwärtsdeklarationen der Structs packt.
Und dann in den Typdefs nicht die neuen Typen verwenden, sondern die 
Structs selber. Dazu dürfen die natürlich nicht anonym sein.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alexander G schrieb:

> Wie geht man denn da an die Sache ran?

Mit einem incomplete type:
struct s_midi_class;

typedef void (*S_midi_read_performed)(const struct s_midi_class *);

...

typedef struct s_midi_class {
  ...
} S_midi_class;

Falls das Ganze für C++ ist, kannste die typedefs für die
struct-Typen auch gleich in die Tonne kloppen: struct s_midi_class
definiert den Namen s_midi_class in C++ als Typnamen (innerhalb
des entsprechenden Scopes), anders als bei C, wo der Name nur
innerhalb des struct namespaces definiert wird.

Autor: Alexander G (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ahh das probiere ich gleich mal aus. Ich nehme mal an eine
> Vorwärtsdeklarationen der Structs
ist also eine struct Definition ohne typedef ja? Hätte ich natürlich 
drauf kommen können. Vielen Dank

@Jörg Wunsch
Das ganze soll C sein und das Wort "Class" in den typen sollen keine C++ 
Klassen oder so sein, sondern auf ein USB Midi-Class Gerät verweisen =)

Danke noch mal

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alexander G schrieb:
> Ahh das probiere ich gleich mal aus. Ich nehme mal an eine
>> Vorwärtsdeklarationen der Structs
> ist also eine struct Definition ohne typedef ja?

Es ist sogar noch weniger. Eine struct ohne Inhalt quasi. ;-)
(das, was Jörg in der ersten Zeile seines Beispiels hat)

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ahh das probiere ich gleich mal aus. Ich nehme mal an eine
>> Vorwärtsdeklarationen der Structs
> ist also eine struct Definition ohne typedef ja?

Nö. Der typedef hat damit nix zu tun. Eine Deklaration ist einfach nur 
eine Bekanntmachung des Namens einer Struktur, während eine Definition 
auch deren Inhalt bekannt gibt.
Der typedef gibt ihr nur einen alternativen Namen. Deine obigen 
Definitionen haben namenlose Strukturen definiert, die dann über den 
Typedef einen "alisas"-Namen bekommen haben.

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Alexander G (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gut also jetzt hab ich wirklich begriffen, wie das funktioniert und mein 
Code lässt sich nun compilieren. Ich habe lediglich Jörgs Beispiel 
hinzugefügt und damit ging es dann. Was auch immer ihr sagt was das 
jetzt bewirkt und wie es heißt,
struct s_midi_class;
schaut für mich einfach mal wie ein Prototyp aus und das ist genau 
wonach ich gesucht habe.

Vielen Dank für die Hilfe

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alexander G schrieb:

> schaut für mich einfach mal wie ein Prototyp aus und das ist genau
> wonach ich gesucht habe.

Offiziell heißt es (glaub ich, bin gerade zu faul, es nachzulesen)
"incomplete struct type".  Der Begriff "Vorwärtsdeklaration" stammt
eher aus Pascal, meint aber das gleiche.

Ein Prototyp ist in C ein spezielles Konstrukt, das eine Funktion
mit ihren Parametern deklariert.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.