Eigener Datentyp (Struct) in Headerdatei unbekannt.

OP #2624837
Ich habe folgendes Problem mit zwei Modulen in C:

In einer Headerdatei abc.h wird ein struct definiert:
1
struct { /* ... */ } structABC;

In einer weiteren Headerdatei xyz.h steht ein Prototyp, der diesen 
Datentyp in seiner Paramterliste hat:
1
void function(structABC* abc);

Nun meckert der Compiler, dass der Datentyp structABC in xyz.h 
unbekannt ist.
Ich habe nun per include abc.h in xyz.h eingebunden. Das funktioniert 
auch. Aber sowas macht man doch üblicherweise nicht, oder? Wie geht denn 
hier die schöne Lösung? :-)
Mark M. schrieb:

> Ich habe nun per include abc.h in xyz.h eingebunden. Das funktioniert
> auch. Aber sowas macht man doch üblicherweise nicht, oder?

Doch. Genau so macht man das.

Du gehst jedes File (egal ob Header-File oder C-Source Code) für sich 
alleine von oben nach unten durch und siehst nach was davon 
C-Schlüsselwörter sind und was du selbst definiert hast. Und dann hältst 
du dich an die Regel: Verwendet werden kann nur, was vorher deklariert 
wurde.

Wenn du also etwas verwenden willst (bei dir der Name einer Struktur in 
einer Parameterliste), dann muss die Sturktur vorher deklariert worden 
sein.

Wenn diese Struktur in einem anderen Header File ist, dann bedeutet das 
dann eben, dass dieses Header File vor der verwendenden Stelle zu 
inkludieren ist.
Natürlich macht man das so.
Wenn etwas in einer Headerdatei deklariert ist, und man braucht es in 
einer anderen (.c oder .h), dann wird es dort per #include eingebunden.

Was sonst?
Und warum sollte man das nicht tun?

(Wenn das böse sein sollte, mache ich seit Jahrzehnten Murks. Das willst 
du mir hoffentlich nicht unterstellen????)
Gast
Mark M. schrieb:
> In einer Headerdatei abc.h wird ein struct definiert:struct { /* ... */ } 
structABC;
> In einer weiteren Headerdatei xyz.h steht ein Prototyp, der diesen
> Datentyp in seiner Paramterliste hat:void function(structABC* abc);

Karl Heinz Buchegger schrieb:
> Doch. Genau so macht man das.

Ääähhmmmmm, im Header wird eine Variable definiert. Im C file wird ein 
Datentyp verwendet.

Meine Variante
1
typedef struct structABC { /* ... */ };
2

3
...
4

5
void function(structABC* abc);
Wohl wahr!
Das hatte ich auch übersehen.
Die Typdefinition gehört in den Header, die Variable davon nicht.

An deiner Lösung zweifle ich allerdings auch leicht :-)

Besser:
1
typedef struct { /* ... */ } structABC;
2

3
...
4

5
void function(structABC* abc);
OP
Zweifler schrieb:
> Ääähhmmmmm, im Header wird eine Variable definiert. Im C file wird ein
> Datentyp verwendet.
Klaus Wachtler schrieb:
> Wohl wahr!
> Das hatte ich auch übersehen.
Zweifler schrieb:
> Meine Variante
1
typedef struct { /* ... */ } structABC;
2
...
3
void function(structABC* abc);

Das geht aber eben nicht, weil structABC aus einem anderen Modul stammt 
und da auch hingehört. void function(structABC* abc); steht dagegen in 
xyz.h als Prototyp einer Funktion in xyz.c !

Klaus Wachtler schrieb:
> Die Typdefinition gehört in den Header, die Variable davon nicht.

Das ist mir auch klar, deswegen hab ich das Thema eröffnet. xyz.c kennt 
structABC, weil ich dort abc.h eingebunden hab. Aber xyz.h weiß nichts 
davon, erst, wenn ich dort nochmal abc.h einbinde.
Gast
Mark M. schrieb:
> weil structABC aus einem anderen Modul stammt

Das ist keine Variable, sondern mit typedef ein neuer Datentyp. Und 
der gehört natürlich in einen Header, der überall wo dieser Strukturtyp 
benötigt wird, einzubinden ist.

Antwort schreiben

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