Funktion wird zweimal deklariert?
lima-city → Forum → Programmiersprachen → C/C++ und D
absicherung
aussehen
begrifflichkeit
berechnung
bibliothek
code
compiler
datei
dateiname
erstellte bibliotheken
fehlermeldung
file
funktion
header
problem
projekt
prototyp
re
schreibfehler
zentrale bibliothek
-
Hallo!
Meine C-Projekte nehmen langsam einen größeren Umfang an und damit kommen auch die Probleme. Ich habe nun also mein erstes Projekt, in dem ich zwei Quelldateien kombiniere, ich habe also eine main.cpp, in der ich eine datop.cpp einbinde. In beiden Dateien brauche ich bestimmte, auch selbst erstellte, Bibliotheken, wobei mir die eigenen große Schwierigkeiten erweisen. So ist z.B. eine meiner Bibliotheken, in der sich eine Funktion zur Berechnung der Fakultät befindet in beiden Dateien eingebunden. Erst beim kompilieren erhalte ich nun aber die Fehlermeldung "main.obj : error LNK2005: "unsigned int __cdecl fak(unsigned int)" (?fak@@YAII@Z) ist bereits in datop.obj definiert." Eindeutig also wurde die Funktion zweimal deklariert. Dabei habe ich bereits einene Anweisung für den Präpozessor hinzugefügt, ohne diese lautet die Fehlermeldung: "Funktion 'unsigned int fak(unsigned int)' hat bereits einen Funktionsrumpf".
Wie komme ich hier weiter? -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
hallo,
vielleicht ist das ja ein Schreibfehler:
ich habe also eine main.cpp, in der ich eine datop.cpp einbinde
Wenn nicht, liegt dort eventuell das Problem. Generell ist es eine ziemlich schlechte Idee, .cpp-Dateien einzubinden, das macht man in der Regel nur mit Headerfiles (*.h) in welchen die Prototypen stehen. Ohne Code kann ich dazu aber nicht mehr sagen.
Noch eine kleine Anmerkung zu den Begrifflichkeiten:
Erst beim kompilieren erhalte ich nun aber die Fehlermeldung "main.obj : error LNK2005: "unsigned int __cdecl fak(unsigned int)" (?fak@@YAII@Z) ist bereits in datop.obj definiert." Eindeutig also wurde die Funktion zweimal deklariert.
Sie wird zweimal definiert, nicht deklariert (das würde auch zu obigem Fehler passen)
Beitrag zuletzt geändert: 19.4.2011 16:02:36 von nomis -
Das kann gut sein. Aber wie soll ich denn die weitere Quelldatei benutzen?
Ich will zum Beispiel eine Funktion von datop.cpp in main.cpp aufrufen. Kann ich das einfach machen? Von Java her kenne ich das so, dass man die einzelnen Klassen miteinander verknüpfen muss, nach dem Motto:
#include "datop.cpp"
Ich habs mal ausprobiert: Lasse ich obiges weg, dann wird die Funktion nicht gefunden...
Beitrag zuletzt geändert: 19.4.2011 16:06:43 von toolz -
Du legst eine Header-Datei an in welcher du die Funktionsprototypen schreibst. Dann bindest du die Header-Datei in deine Main-Datei ein mit Hilfe von include. Dürfte dann so aussehen:
#include "dateiname.h"
Und deren Inhalt etwas so:
#ifndef DATEINAME_H #define DATEINAME_H int funktion(int); void funktion(void); #endif /* DATEINAME_H */
Weiter brauchst du eigentlich nichts machen sollte dann funktionieren.
Gruß S.Brosch
Beitrag zuletzt geändert: 19.4.2011 17:04:57 von software-brosch -
Exakt das habe ich ja gemacht. Deshalb habe ich auch zwei Fehlermeldungen aufgeführt. Die erste, ohne Absicherung durch den Präpozessor:
Und die zweite, die erscheint, wenn ich es genau so mache, wie du es beschrieben hast:Funktion 'unsigned int fak(unsigned int)' hat bereits einen Funktionsrumpf
Das Problem ist anscheinend, dass die Funktion dennoch zweimal definiert wird.unsigned int __cdecl fak(unsigned int)" (?fak@@YAII@Z) ist bereits in datop.obj definiert.
-
Hallo toolz,
die Sache muss wie Folgt aussehen:
fak.h:
#ifndef _FAK_H_ #define _FAK_H_ unsigned long fak(unsigned long n); #endif
fak.cpp:
#include "fak.h" unsigned long fak(unsigned long n) { unsigned long res; res = 1; for(unsigned long i = 2; i<= n; i++) res *= i; return res; }
datop.h
#ifndef _DATOP_H_ #define _DATOP_H_ unsigned long do_something_with_fak(unsigned long n); #endif
datop.cpp:
#include "datop.h" #include "fak.h" unsigned long do_something_with_fak(unsigned long n) { return fak(n/2); }
main.cpp:
#include <iostream> #include "fak.h" #include "datop.h" using namespace std; int main(int argc, char ** argv) { cout << fak(10) << endl; cout << do_something_with_fak(20) << endl; return 0; }
-
Hallo toolz,
beim LNK2005 hilft dir der Präprozessor nicht, da der Compiler mit der zweifachen Definition der Fakultät-Funktion kein Problem hat. Das cpp File wird, wenn es zusätzlich eingebunden wird, zweimal kompiliert. Das ist erst einmal nicht unbedingt verkehrt.
Man kann erstens im Make-File bzw. in den Projekt-Einstellungen festlegen, was kompiliert werden soll.
Dann sollte sicherlich für das Linken noch festgelegt werden, dass wegen
#include "datop.cpp
der Linker datop.obj nicht mehr mit linkt. Dann wird er sich sicherlich auch nicht darüber beschweren, dass er die Funktionsdefinition zweimal findet.
Man kann es aber auch gleich so machen, dass man wie darkpandemic zeigt nur die Funktionsdeklaration einbindet. Damit weiss der Compiler immer Bescheid und geht davon aus, dass die Funktion auch irgendwo definiert ist.
Man muss datop.cpp dann nur noch einmal kompilieren und wie gehabt beim Linken einmal einbinden.
Beitrag zuletzt geändert: 20.4.2011 11:42:01 von matem -
OK! Jetzt habe ich das verstanden.
Nachdem ich eine zentrale Bibliothek angelegt habe, auf die in beiden Dateien zugegriffen wird und in denen die Funktionsrümpfe drin sind, klappt es wunderbar.
Ich danke euch! -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage