#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 ;
autschdeshalb 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__"
zurueckdeshalb 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 wirdsolltest 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 übervoid 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.