#defines in .cpp Datei sind nicht in eingebundener Header Datei sichtbar!



  • Hallo!

    Mein Problem skizziert sich folgendermaßen:
    Ich habe eine main.cpp etwa so:

    #define _TEST_
    
    #include "testlib.h"
    
    void main(){
    //mach was mit der Testklasse
    }
    

    Die testlib.h sieht so aus:

    #ifndef _TEST_
    #error Define wurde nicht erkannt!
    #endif
    
    class test{
      public:
        test();
    //irgenteine Klasse
    };
    

    Dazu kommt noch eine testlib.cpp:

    #include "testlib.h"
    test::test(){
    //irgentein Konstruktor
    }
    

    Beim Compilieren wird immer der error ausgegeben.
    Wie bekomme ich es hin, dass ich in der main.cpp Defines setzen kann welche
    dann in der Eingebundenen Header Datei sichtbar sind?

    Ich hab schon etwas länger daran rungespielt und rausgefunden, dass wenn ich
    die testlib.cpp Datei weglasse, also alle Funktionen der Klasse in der Header
    Datei definiere das Define aus der main in der Header Datei ankommt!
    Scheinbar wird die testlib.cpp zusammen mit der testlib.h zuerst Compiliert??

    Zum Hintergrund:
    Ich habe eine kleine Library geschrieben die durch Präprozessor Anweisungen vom
    Anwender angepassbar sein soll. Das ganze soll auf einem Mikrocontroller
    laufen, daher habe ich mich für Präprozessor Anweisungen anstatt if/else direkt
    im Code entschieden.

    Ich hoffe eine/r von euch kennt sich gut mit dem c++ Präprozessor aus und kann mir helfen.



  • Musst das #define dann schon in jede Deiner *.cpp machen.
    #include tut ja nur den Text der *.h in die *.cpp reinkopieren, compiliert wird nur jede *.cpp.

    Konsistent halten kannste die z.B. so:

    //#define _TEST_
    #include "config.h" //alle defines
    
    #include "testlib.h"
    
    void main(){
    //mach was mit der Testklasse
    }
    


  • Hallo,

    das geht nicht.

    Dein Ansatz ist nicht sauber durchdacht. Versuch es mal mit einem Header welcher deine Einstellungen enthält. Diesen inkludierst du in der CPP und in der Library.

    So kannst du an beiden Stellen das Define sehen und darauf reagieren.



  • Sicher, dass der Fehler nicht beim Kompilieren der testlib.cpp kommt?



  • Du kannst dem Compiler ein define als Argument übergeben, also z.B. -D_TEST_. Die konkrete Syntax hängt vom Compiler ab => Doku lesen



  • Das Problem ist nämlich, dass ein #define nur pro Source gültig ist.
    Sprich, wenn du in der main.cpp _TEST_ definest, wird die main.cpp kompiliert, da beim includen der Header eingefügt wird und die Bedingung gilt, aber nicht die teslib.cpp, da dort kein Makro definiert wurde und die Bedingung im Header nicht gilt.



  • Danke für die schnellen Antworten!

    Die Sache mit der config.h Datei in der die Defines stehen ist nicht befriedigend für mich.
    Ich wollte mit meiner Library mehrere Projekte schreiben und dabei die Library im Standard Lib Ordner speichern.
    Für jedes Projekt bräuchte ich aber eine andere config.h die ich der Library bekannt machen muss(#include in der cpp).
    Deswegen könnte ich nicht mit der selben Library in verschienen Projekten arbeiten.

    Es wird wohl darauf hinauslaufen, dass meine Library nur aus einer .h Datei bestehen darf.



  • Gast Björn schrieb:

    Es wird wohl darauf hinauslaufen, dass meine Library nur aus einer .h Datei bestehen darf.

    Bloß nicht!
    Mach einfach folgendes:
    Du lieferst den Sourcecode deiner Lib aus, inklusive Makefile o.ä. Der User deiner Lib muss sie dann selber bilden und dabei entsprechende Makros setzen.
    Anschließend bindet er die fertige Lib in sein Programm ein und muss dabei ggf. auch diese Makros setzen.
    Ein weiterer Vorteil von dieser Version ist, dass du nicht für jeden Compiler einer Version ausliefern musst.


Anmelden zum Antworten