Probleme mit dem C++ Präprozessor



  • Hallo Programmierer,

    ich möchte Quellcode mittelst #include includieren, der Quellcode ist aber mal in dem einem ordner und mal in dem anderen ordner

    ich will folgendes Makro programmieren:

    #define SEARCH_PATH /home/user/ordner/bla
    
    #define MAKRO(x) // was muss hier hin?
    
    #include MAKRO(fileA.hpp)
    #include MAKRO(fileB.hpp)
    #include MAKRO(fileC.hpp)
    
    #include MAKRO(fileA.hpp)
    

    soll zu

    #include "/home/user/ordner/bla/fileA.hpp"
    

    expandiert werden.

    Wie geht das?



  • Dir ist schon klar, dass man dem Compiler den Suchpfad übergeben kann?



  • Ich weiß dass man dem Compiler nen such Pfad übergeben kann, leider benutze ich die Arduino IDE auf verschiedenen fremden Rechnern an denen ich nix rummachen kann. Compilier Befehl ändern ist also leider nicht möglich, trotzdem Danke.



  • Da gibt man gewöhnlich ein makefile mit, das die Kompilierung definiert...



  • Die Arduino IDE kann leider keine Makefiles einlesen 😞



  • kryptomatrix schrieb:

    Ich weiß dass man dem Compiler nen such Pfad übergeben kann, leider benutze ich die Arduino IDE auf verschiedenen fremden Rechnern an denen ich nix rummachen kann. Compilier Befehl ändern ist also leider nicht möglich, trotzdem Danke.

    Du kannst nicht die Projekteinstellungen in der Arduino IDE verändern?
    Das ist doch sehr merkwürdig



  • Nein Projetkeinstellungen ändern geht nicht:

    Das Programm muss auf Laptops laufen die sich bei jedem hochfahren resetten.
    Außerdem ist die Bibliothek für Schüler gedacht die nicht in der lage sind was an den Projekteinstellungen zu schrauben (die wissen gar nicht was ein Kompiler ist)



  • Such mal nach dem STRINGIZE Makro sowie den Makro-Operatoren # und ## 😉

    In etwa so

    // Ich habe der Einfachheit noch den Slash am Ende des Pfades hinzugefügt
    #define SEARCH_PATH /home/user/ordner/bla/
    
    #define STR(X) #X
    #define STR2(X) STR(X)
    #define CONCAT(X,Y) X##Y
    
    #define MAKRO(x) STR2(SEARCH_PATH) STR(x)
    

    (das CONCAT brauchst du nur, wenn du zwei Identifier zusammenfügen willst - habe ich nur der Vollständigkeit hier aufgeführt)

    Hier ein Test damit: http://ideone.com/m5Gj1G

    Für das Benutzen von Makros innerhalb einer Include-Direktive s. Using macro inside an include statement



  • Hier wohl die für dich richtige Version:

    #define SEARCH_PATH /home/user/ordner/bla/
    
    #define STR(X) #X
    #define STR2(X) STR(X)
    #define CONCAT(X,Y) X##Y
    #define EXPAND(x) x
    
    #define MAKE_PATH(x) STR2(EXPAND(SEARCH_PATH)x)
    #define MAKRO(x) MAKE_PATH(x)
    
    #include MAKRO(fileA.hpp)
    

    s.a. http://ideone.com/Zx0uUH (mit erwarteter Fehlermeldung, aber richtigem Pfad 😉



  • Danke, funktioniert

    ich wusste schon was #x und x##y macht, irgendwie hats aber nie geklappt.

    Ich wusste nicht das EXPAND(SEARCH_PATH)x zu /home/user/ordner/bla/fileA.hpp gepräprozessort wird, ich dachte ich bräuchte da nen ## und hab

    #define MAKE_PATH(x) STR2(CONCAT(EXPAND(SEARCH_PATH), x))
    

    versucht das hat aber net getan:

    dslTest:9: error: pasting ")" and "dsl_Servo_Unstable" does not give a valid preprocessing token
    dslTest.ino:5:21: note: in definition of macro 'CONCAT'
    dslTest.ino:10:20: note: in expansion of macro 'MAKE_PATH'
    dslTest.ino:12:10: note: in expansion of macro 'DSL_LIB'
    pasting ")" and "dsl_Servo_Unstable" does not give a valid preprocessing token

    Großen Dank an dich


Log in to reply