#ifndef in headerfiles
-
Hallo,
hab 4 module und möchte eins von den modulen in alle anderen verwenden. wenn ich es einfach include kommt ein fehler wegen mehrefacher definition, oder sowas in der art. dann hab ich in das eine modul , das in allen andern aufgerufen wird, folgenden code geschrieben:
#ifndef UMWANDELN_H #define UMWANDELN_H char* toChars(char* in, int anz); char* cmb(char*str1,char *str2); void *backChar(char* str); #endif
und danach in den anderen modulen mit include "umwandeln.h" aufgerufen.
jetzt kommen aber wieder die fehler mit mehrfach definitionen.
Fehlermeldung:
1>fuhrparkverwaltung.obj : error LNK2005: "char * __cdecl toChars(char *,int)" (?toChars@@YAPADPADH@Z) ist bereits in main.obj definiert.
1>fuhrparkverwaltung.obj : error LNK2005: "char * __cdecl cmb(char *,char *)" (?cmb@@YAPADPAD0@Z) ist bereits in main.obj definiert.
1>fuhrparkverwaltung.obj : error LNK2005: "void * __cdecl backChar(char *)" (?backChar@@YAPAXPAD@Z) ist bereits in main.obj definiert.
1>kundenverwaltung.obj : error LNK2005: "char * __cdecl toChars(char *,int)" (?toChars@@YAPADPADH@Z) ist bereits in main.obj definiert.
1>kundenverwaltung.obj : error LNK2005: "char * __cdecl cmb(char *,char *)" (?cmb@@YAPADPAD0@Z) ist bereits in main.obj definiert.
1>kundenverwaltung.obj : error LNK2005: "void * __cdecl backChar(char *)" (?backChar@@YAPAXPAD@Z) ist bereits in main.obj definiert.was muss ich falsch gemacht und was muss ich verändern?
mfg sascha
-
Hi!
Pack die Definitionen der Funktionen in eine extra datei, z.B. Umwandlung.c
Deine Deklarationen, so wie du sie gepostet hast, kommen in die Datei Umwandlung.h rein.
Beide Dateien zum Projekt hinzufügen.
In den Dateien, in denen du eine dieser Funktionen brauchst, musst du dann
#include "Umwandlung.h" schreiben.Wenn die Meldung immer noch kommt, dann lösch mal deine Objektdateien
(fuhrparkverwaltung.obj, fuhrparkverwaltung.obj, etc.) und lass sie neu aufbauen.
-
so hab ich es gemacht, hab die deklerationen (den code von oben) in die datei umwandeln.h gespeichert und die ganze funktion dann in umwandeln.c und da hab ich umwandeln.h includet.
wie kann ich denn die .obj datei löschen ich seh die bei meine projekt ordner nicht?
-
sascha191088 schrieb:
so hab ich es gemacht, hab die deklerationen (den code von oben) in die datei umwandeln.h gespeichert und die ganze funktion dann in umwandeln.c und da hab ich umwandeln.h includet.
wie kann ich denn die .obj datei löschen ich seh die bei meine projekt ordner nicht?Windows-Dateisuche?
-
hab ich auch schon gemacht, aber die suche findet auch nichts
-
sascha191088 schrieb:
... und da hab ich umwandeln.h includet...
Da brauchst du nicht includen, wenn da nur die Funktionsprototypen drin stehen, sondern da wo du die Funktionen aufrufst.
sascha191088 schrieb:
wie kann ich denn die .obj datei löschen ich seh die bei meine projekt ordner nicht?
VS bietet die Option bereinigen. Ich kenne deinen Compiler nicht. Ansosten sind die irgendwo auf deiner Festplatte, muttu suchen.
-
jetzt geht es
, hab in umwandeln.c nicht mehr umwandeln.h includet und dann ging es. normal muss man doch das machen wenn in der der header datei die dekleration der funktioen von der .c datei steht. muss man das wegen dem ifndef nicht machen oder warum?
-
sascha191088 schrieb:
normal muss man doch das machen wenn in der der header datei die dekleration der funktioen von der .c datei steht.
Nein. Man bindet keine .c/.cpp-Dateien mit Includedirektiven ein.
-
so wird das doch gemacht, oder?
http://www2.hs-esslingen.de/~sarait00/modul.JPG
-
Kommt drauf an, was die Pfeile darstellen sollen. Wenn das Includedirektiven sein sollen, ist das falsch.
-
der pfeil von der c datei zur header ist die exportschnittstelle und von header zur main ist die importschnittstelle.
wenn ich es ohne #ifndef mach oderso was in der art muss ich in die c datei die header datei includen. und natürlich auch in der main.c oder sowas.
-
sascha191088 schrieb:
der pfeil von der c datei zur header ist die exportschnittstelle und von header zur main ist die importschnittstelle.
Bahnhof?
sascha191088 schrieb:
wenn ich es ohne #ifndef mach oderso was in der art muss ich in die c datei die header datei includen. und natürlich auch in der main.c oder sowas.
Nein, das musst du nie. Das ist - wie gesagt - falsch. Du musst allerdings jede .c-Datei kompilieren.
-
sascha191088 schrieb:
der pfeil von der c datei zur header ist die exportschnittstelle und von header zur main ist die importschnittstelle.
wenn ich es ohne #ifndef mach oderso was in der art muss ich in die c datei die header datei includen. und natürlich auch in der main.c oder sowas.die sogenannten include-guard ( #ifndef, .. ) sollte/muss man immer machen, um mehrfaches einbinden zu verhindern.
wenn du in der headerdatei nicht nur die funktionen sondern z.b. ne struktur deklarierst, die du in deiner c-datei brauchst, dann musst du auch in der c-datei inkludieren.