*.h und *.cpp wirrwar



  • Hullo

    ich möchte meinen Programmcode auf mehrere Teile aufspalten, bekomm dies aber leider nicht hin.

    Die Datein wären:

    main.cpp -Hauptprogramm
    global.h -alle include datein und prototypen fuer globale funktionen
    global.cpp -globale funktionen
    csprite.h -Definition einer Klasse und einer Strucktur
    csprite.cpp -Methoden der in csprite.h definierten Klasse

    In global.h hab ich den vollgenden Kopf drinnern stehn:

    #ifndef __GLOBAL_H__
    #define __GLOBAL_H__
    
    #include <stdlib.h>
    #include <stdio.h>
    .
    .
    .
    #endif
    

    In csprite.h:

    #ifndef __CSPRITE_H__
    #define __CSPRITE_H__
    
    struct struct_frame{
    	SDL_Surface *bmp;
    .
    .
    .
    #endif
    

    in den cpp datein

    #include "global.h"
    #include "Csprite.h"
    

    Ich verwende DEV-C++ und wenn ich das Programm compilieren will, dann bekomm ich
    zahlreiche Fehlermeldungen von wegen multible definitionen von XXXX (globalen Variablen in global.h)

    Was mache ich falsch?
    thx



  • du musst die Variablen in eine cpp speichern, ist doch klar. diese Variablen kannst du dann von anderen cpp-Dateien aus per extern ansprechen, also

    //main.cpp
    int i;
    
    //xyz.cpp
    extern int i;
    
    i=5;	//geändert
    


  • mm-motm schrieb:

    Ich verwende DEV-C++ und wenn ich das Programm compilieren will, dann bekomm ich
    zahlreiche Fehlermeldungen von wegen multible definitionen von XXXX (globalen Variablen in global.h)

    Was mache ich falsch?
    thx

    Eigentlich sieht es in Ordnung aus. Kann es sein, dass der Fehler erst beim Linken kommt. In .h Dateien solltest du globale Variablen nur deklarieren und in einer .cpp Datei definieren. Ansonsten hast du dann in jeder Translation Unit die globalen Variablen neu drin, und der Linker beschwert sich. Also in .h allen Variablen ein extern vorsetzen, damit das nur Deklarationen werden.

    Ein großer Fehler ist es auch Include Guards zu verwenden, die mit _ beginnen. Für dich sind alle Namen, die mit einem _ beginnen oder zwei _ hintereinander haben, verboten. Die darf nur dein Compilerhersteller verwenden. Ein GLOBAL_H reicht doch auch.



  • Danke für dei schnellen Antworten.

    Ahh, jetzt funktionierts. Gut also ich hab jetzt in der header datei die Variablen deklariert (also extern davor gesetzt) und alle Fehler schein vergessen.

    Danke für die Hilfe

    ps: was sind Include Guards, ich muss ja sagen ich bin bis jetzt immer mit einer
    main.cpp zurueck gekomme und hab deswegen ziemlich wenig ahnung was man so alles beachten muss beim aufteilen des codes.



  • Wenn ich ja schon dabei bin fragen zu Stellen.

    Ich hab da ein ähnliches Problem wie vorher, jetzt betrifft es aber den Konstruktor der in einem der header datein deklarierten Klasse.

    Wenn ich in der header datei den Konstruktor nur deklarieren
    class Klasse
    {
    Klasse();
    ...
    };

    und in der passenden cpp datei dann
    Klasse:Klasse()
    {
    i=0;
    }

    schreibe, dann bekomme ich wieder mal die Fehlermeldung "mehrmalige Definition von Klasse::Klasse()". Definiere ich den Konstruktor allerdings in der header datei (also schreibe dien codeblock in den geschweiften klammern direkt in die
    class deklration rein, dann funktioniers. Es funktioniert allerdings auch wenn ich dem Konstruktor einen Parameter uebergebe.

    Warum? Wie kann ich Konstruktor in der Klassen deklaration leer lassen, und ihn dann mit dem Rest der Methoden Definieren?



  • mm-motm schrieb:

    ...
    schreibe, dann bekomme ich wieder mal die Fehlermeldung "mehrmalige Definition von Klasse::Klasse()". Definiere ich den Konstruktor allerdings in der header datei (also schreibe dien codeblock in den geschweiften klammern direkt in die
    class deklration rein, dann funktioniers. Es funktioniert allerdings auch wenn ich dem Konstruktor einen Parameter uebergebe.

    Warum? Wie kann ich Konstruktor in der Klassen deklaration leer lassen, und ihn dann mit dem Rest der Methoden Definieren?

    Hast du zufällig die selbe Datei mehrmals kompiliert? Werden .cpp Dateien irgendwie included? Hast du mal alle .o Dateien gelöscht und alles neu gebaut?



  • waaaaaa ich hasse diese IDE

    das Problem mit den Konstruktor der Klasse hab ich jetzt einfach mal links liegen
    gelassen, und den Konstruktor inline definiert. Seitdem ich allerdings eine
    globale Variable in der Header datei umbenannte habe (und überall anders im Programm), bekomm ich beim compilieren mehr als 60 Meldungen von wegen undefinierter referenzen:

    main.o(.text+0x36d):main.cpp: undefined reference to gc_keys' main.o(.text+0x378):main.cpp: undefined reference togc_button'
    main.o(.text+0x37f):main.cpp: undefined reference to gc_button' main.o(.text+0x386):main.cpp: undefined reference togc_button'
    main.o(.text+0x38d):main.cpp: undefined reference to `gi_mouse'

    was soll das?



  • Ok...

    die linker Fehler koennen behoben werden indem man in einer der cpp datein
    eine Definition der variablen durchfuehrt. naja warum was genau, keine ahnung
    fuer jemanden der vielleicht mal das gleiche Problem hat. Die Lösung findet man unter

    http://www14.brinkster.com/aditsu/dev-cpp-faq.html#link


Anmelden zum Antworten