#define-Makros & bedingt Kompilierung



  • Hallo.

    Ich möchte mir ein Makro basteln, dass sich so verhält wie das TRACE-Makro der MFC. Leider weiß ich nicht, ob - und wie - man da noch eine bedingt Kompilierung einfügt.

    #define _DEBUG_
    #define DEBUG(function,message)
      (
    #ifdef _DEBUG_
        printf("%s() --- %s\n",function,message);
    #endif
      )
    

    Ist jetzt nicht richtig, ich weiß :p

    Kann mir mal jemand auf die Sprünge helfen?

    Bye.



  • ich hab es in etwa so:

    inline void trace(char const* message, char const* file, char const* line)
    {
      cout<<message<<" - in "<<file<<" on line "<<line;
    }
    
    inline void noop()
    {
    }
    
    #ifndef NDEBUG
    #  define TRACE_IMPL(message, file, line) trace(message, file, line)
    #  define TRACE(message) TRACE_IMPL(message,__FILE__,STRINGIZE(__LINE__))
    #else
    #  define TRACE(message) noop()
    #endif
    

    natuerlich gibts da noch ne menge zu tun, aber so in etwa sieht die grundstruktur aus.



  • Shade Of Mine schrieb:

    #define TRACE_IMPL(message, file, line) trace(message, file, line)
    #define TRACE(message) TRACE_IMPL(message,__FILE__,STRINGIZE(__LINE__))
    

    Was macht denn STRINGIZE? Ich hätte das jetzt so gemacht:

    void trace(char*,char*,int) und dann

    #define TRACE(msg) trace(msg,__FILE__,__LINE__)

    Und wieso die noop()-Funktion? #define TRACE() tuts doch auch. Oder stört dann das Semikolon?



  • DrGreenthumb schrieb:

    Was macht denn STRINGIZE? Ich hätte das jetzt so gemacht:

    __LINE__ in einen string umwandeln... ich dachte, jeder hat ein stringize:

    #define STRINGIZE_IMPL(expr) #expr
    #define STRINGIZE(expr) STRINGIZE_IMPL(expr)
    

    Und wieso die noop()-Funktion? #define TRACE() tuts doch auch. Oder stört dann das Semikolon?

    beispiel:

    Klasse* p;
    if(foo)
      TRACE("geile sache");
    p=new Klasse;
    p->foobar();
    

    das funktioniert ja ganz gut - doch stell dir vor, jemand kompiliert nur in der release version und vergisst das ;
    autsch

    deshalb sollten sich debug und release version gleich verhalten.
    und noop() ist ja ein noop befehl 🙂



  • #define STRINGIZE_IMPL(expr) #expr 
    #define STRINGIZE(expr) STRINGIZE_IMPL(expr)
    

    Ich überseh bestimmt wieder was, aber spricht gegen ein

    #define STRINGIZE(expr) #expr
    


  • wenn expr ein makro ist, liefert zB

    STRINGIZE(__LINE__)
    ein doofes
    "__LINE__"
    zurueck

    deshalb musst du eine zwischenstufe einbauen, in der __LINE__ expandiert wird.
    STRINGIZE(__LINE__)
    ruft nun
    STRINGIZE_IMPL(21)
    auf - da in dieser zwischen stufe das makro expandiert wird

    solltest du STRINGIZE nur mit nicht-makros aufrufen, kannst du natuerlich auf das _IMPL verzichten.



  • Hallo.

    Na super Leute, jetzt blick ich überhaupt nicht mehr, was ihr von mir wollt.
    Ich wollte bloß ein Makro, dass ich über

    void xxx()
    {
       DEBUG("xxx","entry point")
       //do something
       DEBUG("xxx","somhething done")
    }
    

    aufurfen kann und das mir dann die Ausgabe

    ***DEBUG: void() --- entry point
    ***DEBUG: void() --- something done
    

    (auf der Konsole) erzeugt. Dazu sollte

    DEBUG("x","Hallo")
    

    in

    #ifdef _DEBUG_
    printf("***DEBUG: x() --- Hallo\n");
    #endif
    

    expandieren.

    Bye.



  • was ist an meinem beispiel unklar?



  • Hallo.

    Hmm... ich werd's mal ausporbieren. Muss(te) erstmal verstehen, was du da fabiziert hast. 😉

    Bye.


Anmelden zum Antworten