kostenloser Webspace werbefrei: lima-city


Funktion wird zweimal deklariert?

lima-cityForumProgrammiersprachenC/C++ und D

  1. Autor dieses Themas

    toolz

    Kostenloser Webspace von toolz

    toolz hat kostenlosen Webspace.

    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?
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. 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
  4. Autor dieses Themas

    toolz

    Kostenloser Webspace von toolz

    toolz hat kostenlosen Webspace.

    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
  5. s*************h

    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
  6. Autor dieses Themas

    toolz

    Kostenloser Webspace von toolz

    toolz hat kostenlosen Webspace.

    Exakt das habe ich ja gemacht. Deshalb habe ich auch zwei Fehlermeldungen aufgeführt. Die erste, ohne Absicherung durch den Präpozessor:
    Funktion 'unsigned int fak(unsigned int)' hat bereits einen Funktionsrumpf
    Und die zweite, die erscheint, wenn ich es genau so mache, wie du es beschrieben hast:
    unsigned int __cdecl fak(unsigned int)" (?fak@@YAII@Z) ist bereits in datop.obj definiert.
    Das Problem ist anscheinend, dass die Funktion dennoch zweimal definiert wird.
  7. 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;
    }
  8. 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
  9. Autor dieses Themas

    toolz

    Kostenloser Webspace von toolz

    toolz hat kostenlosen Webspace.

    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!
  10. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!