Selbstdefinierte Dateitypen in Header
-
hallo,
ich hab mittels typedef eigenen Dateitypen erstellt.
nun hab ich folgendes:
// header.h #ifndef HEADER_H #define HEADER_H EigenerDateityp *funktion(); #endif
und
// header.c #include "header.h" #include "dateityp.h" // hier ist EigenerDateityp definiert EigenerDateityp *funktion() { // ... }
hier gibt der compiler (verständlicherweise) eine fehlermeldung aus, weil er "EigenerDateityp" aus header.h nicht kennt.
wenn ich header.h abändere in:
#ifndef HEADER_H #define HEADER_H #include "dateityp.h" EigenerDateityp *funktion(); #endif
dann gibt der compiler eine fehlermeldung aus, nämlich "multiple definition of ..."
wie ist es jetzt richtig?
was mich auserdem nervt, ist, dass man dem compiler die datei, in der die funktionen vollständig geschrieben wurden (also nicht nur die "vordefinition" damit der compiler die funktionen kennt), in diesem fall wäre das header.c, mit angeben muss, d.h.
gcc <weitere dateien...> header.c -o header.exeich finde das ein bissl nervend. ich habe mir einige dateien aus der stdlib angeschaut, und da ist z.b. in stdio.h auch nur die "vordefinitionen", die eigentlichen funktionen sind woanders, aber trotzem muss ich nur stdio.h angeben, damit der compiler alle funktionen vollständig kennt (ich hoffe das war jetzt verständlich).
-
p.s.: sorry, ich meine natürlich "Datentypen" und nicht "Dateitypen"
-
Haste in der dateityp.h auch
#ifndef DATEITYP_H #define DATEITYP_H /*irgendwas*/ #endif
?
-
volkard ist wieder da
-
ja, halt ein typedf. da stimmt schon alles.
ist ein struct.
-
ja. schrieb:
ja, halt ein typedf. da stimmt schon alles.
ist ein struct.Kannste mal alle beteiligten Dateien zeigen? Dann tue ich die bei mir in den Compiler und finde sicher den Fehler.
-
evtl
struct EigenerDateityp *funktion();
-
volkard schrieb:
ja. schrieb:
ja, halt ein typedf. da stimmt schon alles.
ist ein struct.Kannste mal alle beteiligten Dateien zeigen? Dann tue ich die bei mir in den Compiler und finde sicher den Fehler.
naja ich poste hier ungern richtigen code. das oben ist halt nur eine "analogie" zu meinem richtigen post.
aber das ist etwa das gleiche:
// dateityp.h #ifndef DATEITYP_H #define DATEITYP_H typedef struct { unsigned int var1; unsigned short var2; int var3; char var4[10]; } EigenerDateityp; #endif
stimmt doch so alles, oder?
-
sinnloses gebrabbel schrieb:
naja ich poste hier ungern richtigen code. das oben ist halt nur eine "analogie" zu meinem richtigen post.
Klar. Solltes ja nur ein geschrumpftes Beispiel posten.
Also
//main.c #include <stdio.h> #include <stdlib.h> #include "header.h" int main() { printf("Hello world!\n"); return 0; } // dateityp.h #ifndef DATEITYP_H #define DATEITYP_H typedef struct { unsigned int var1; unsigned short var2; int var3; char var4[10]; } EigenerDateityp; #endif // header.c #include "header.h" #include "dateityp.h" // hier ist EigenerDateityp definiert EigenerDateityp *funktion() { } // header.h #ifndef HEADER_H #define HEADER_H #include "dateityp.h" EigenerDateityp *funktion(); #endif
compiliert bei mir.
edit: SInd 4 Dateien, hab sie der EInfachheit zusammenkopiert nur zum Posten.
-
Die Standard-Includes vom Compiler sind auch in der C-Standard-library abgelegt.
Und die wird automatisch dazu gebunden.Ist das DATEITYP_H auch beides mal gleich geschrieben?
-
ja, DATEITYP_H ist richtig geschrieben.
bei mir kompiliert mein richtiger quellcode nicht, es gibt fehlermeldungen ala:
`C:\Users\ICH\AppData\Local\Temp\cc8meMcu.o:test.c:(.rdata+0x4): first defined here`
ich verstehs nicht...
in der main.c inkludiere ich beide dateien:
// main.c anfang #include <stdio.h> #include "dateityp.h" #include "header.h" int main() // ...
??????
-
Zyklische Inkludierungen?
Oder haste irgendwo eine *.c inkludiert?
-
volkard schrieb:
Zyklische Includierungen?
erklärung bitte?
was genau meinst du?
ich brauche die datei "header.h" in der main, sonst kann ich ja die funktionen aus der nicht benutzen.
und wenn ich "dateityp.h" entferne, gibt es den fehler immernoch. es liegt also nicht daran.
-
nein, überall .h
der quelltext ist, soweit ich das grad beurteilen kann, einwandfrei.
ich hab das problem übrigens öfter. bisher noch nicht herausgefunden, woran das liegt.
-
geht nicht... schrieb:
ja, DATEITYP_H ist richtig geschrieben.
bei mir kompiliert mein richtiger quellcode nicht, es gibt fehlermeldungen ala:
Headerdateien umbenennen und zwei neue erstellen. Den Code kompilierfähig machen und dann Stück für Stück die Headerdateien neu aufbauen und kompilieren, bis du auf die Fehlerursache triffst.
-
also laut der compilermeldung liegt es an einem string, der angeblich mehrmals definiert wurde. das ist aber falsch, es gibt nur einen string im ganzen quelltext mit diesem namen.
also ich muss schon sagen... die compilermeldung könnte etwas aufschlussreicher sein!
-
p.s.: wenn ich den string auskommentiere, lässt es sich kompilieren. wenn ich den string umbennene, dann besteht das problem weiterhin!!!
-
nachtrag schrieb:
also laut der compilermeldung liegt es an einem string, der angeblich mehrmals definiert wurde. das ist aber falsch, es gibt nur einen string im ganzen quelltext mit diesem namen.
also ich muss schon sagen... die compilermeldung könnte etwas aufschlussreicher sein!
String in einem Header definiert? SOllte auch nicht. Dort nur als extern anmelden. Und in der *.c definieren.
-
nachtrag schrieb:
also ich muss schon sagen... die compilermeldung könnte etwas aufschlussreicher sein!
Jo, da sagste was.
Hatte früher saugerne dazu mehrere Compiler installiert, damit ich von den verschiedenen Compilern die Fehlermeldungen anschauen konnte.
Borland war hilfreich meistens.
Microsoft war kacke meistens.
gcc war damals noch indiskutabel.
(edit: Ist heute eher andersrum. Aber egal, wenn das Programm auf mehreren Compilern geht, frag immer mal einen anderen bei häßlichen Problemen. Ok, hätte hier jetzt auch nicht geholfen.)
-
jetzt geht es! danke!
dass man strings nicht in headern definieren soll wusste ich garnicht.
gilt das generell? dass man typedefs, bzw. andere globale variablen nicht im header definiereh soll?