Fehlermeldung bei eigener Headerdatei



  • hallo,

    ich habe ein Projekt bei dem ich mehrere Variabeln in einer header datei "var.h" ausgelagert habe. Das habe ich gemacht damit diese Variabeln meheren verschiedenen Funktionen zugänglich sind, welche sich in unterschiedlichen cpp dateien befinden.

    die header datei sieht so aus:
    //----------------------------------------------------
    #ifdef MODUL0
    #define EXTERN
    #else
    #define EXTERN extern
    #endif

    #include <sdl.h>

    EXTERN SDL_Surface *screen;
    EXTERN SDL_Surface *mapbuffer;
    EXTERN SDL_Surface *picbuffer;

    //ACHTUNG sowas wie int clickx = 0 geht nicht

    //---für movescreen--
    EXTERN int currentscreenx; //2
    EXTERN int currentscreeny;
    EXTERN int sollx, solly; //speicher die distanz zwischen zentrum und Klick

    //-------------------kolisions kontr.
    EXTERN int clickx; //0
    EXTERN int clicky;
    //-------------------

    EXTERN SDL_TimerID curstimer, speccurstimer;
    <<------- Bis hier geht alles
    //---------------------------
    struct MASKE
    {
    int x;
    int y;
    AnsiString objekt;
    AnsiString oldobjekt;
    int walk; //0 = nein, 1 = ja
    int mob;
    };
    MASKE BILDMASKE[16000];
    //---------------------------------------------------------

    Mein Problem ist das bei compilieren gleich mehrere Fehler kommen, die ohne das Strukt MASKE nicht kommen. Die Fehler wären:

    1. Bei "AnsiString objekt" wird ein Typenname erwartet. ka was der will
    2. Für die selbe Zeile sagt er auch das "in der Deklaration ";" fehlen würde
    3. Die beiden Meldungen noch einmal für die Zeile "AnsiString oldobjekt"
    4. 2 Fehlermeldungen darüber das der "Bezeichner MASKE::AnsiString" bereits deklariert sei.

    Wird jemand aus meiner Schilderung schlau und kennt zu dem noch die Lösung des Problems? Ich hoffe es.



  • Hallo

    AnsiString ist kein Build-In Typ wie int. Der C++ Compiler kennt diesen Typ nicht, was ja auch die erste Fehlermeldung sehr treffend aussagt.
    Du must noch die passende Header-Datei aus der VCL mit einbinden, der Einfachkeit #include <vcl.h>

    bis bald
    akari



  • danke für die schnelle Anrowrt, wie schnell das hier geht, geil.

    danke, damit hat es funktioniert. Ich verstehe daran nur etwas nicht, und zwar:

    Durchs testen habe ich herausgefunden das ich ein Strukt mit AnsiStrings in einer Headerdatei haben kann, ohne die vcl.h zu includen. Binde ich diese header datei jedoch in mehrere cpp´s ein, hagelt es fehlermeldung bezüglich des Strukts, bis ich die vcl.h einbinde. Kannst du mir erklären wiso diese datei nur bei Structs und auch nur dann wenn der header mehrfach benutzt wird gebraucht wird?



  • Der Borland-Builder erzeugt ja die CPP und die dazugehörige Header-Datei automatisch (zumindestens das Grundgerüst).
    Die CPP-Datei sieht dann so aus:

    #include <vcl.h>
    #pragma hdrstop
    
    #include "frmTest.h"
    

    Somit wird die <vcl.h> von der Source-Datei und nicht von der Header-Datei eingebunden (das an sich nicht ganz C++ konform ist).
    Durch die "#pragma hdrstop"-Anweisung wird jedoch die <vcl.h> als vorkompilierte Header-Datei verwendet, d.h. sie muß nur einmal im Projekt geparst werden (und nicht jedesmal für jede Source-Datei) - dies geht aber nur in den Source-Dateien, nicht in der Header-Dateien.

    Wenn du die Header-Dateien auch für andere Sourcen verwenden willst (welche nicht von der VCL abhängen sollen), dann solltest du als Datentypen nur die eingebauten und die der Standard C++ Bibliothek (wie z.B. std::string, std::size etc.) verwenden.
    Verwende daher AnsiString nur in VCL-Sourcen.

    P.S. Die Verwendung des Präprozessors bzgl. "EXTERN" spart zwar ein wenig Tipparbeit, ist aber für C++ Projekte weniger geeignet.

    Du solltest dir besser dafür eigene Klassen anlegen, anstatt Unmengen von globalen Variablen (denn diese sind in C++ "böse" -)



  • ja, ich habe in letzter zeit sehr oft gelesen, das globale variablen böse sind.
    Mittlerweile traue ich ihnen auch kaum noch, und guck immer wieder zum Bildschirm, weil ich nicht weiss ob sie was planen.^^

    Aber mal im Ernst, wie würde es ganz grob aussehen sich eine eigene klasse zu schreiben?


Anmelden zum Antworten