1 | |
2 | |
3 | |
4 | |
5 | |
Jetzt möchte ich die untere funktion abschalten, jedoch geht das nicht da SF_DEBUGOUT ja leider definiert ist (mit void 0), gibt es hier schicke wege das irgendwie doch zu tun?
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
|
Anzeige
|
Preprozessor #ifdef um eine Funktion ab zu schalten
Jetzt möchte ich die untere funktion abschalten, jedoch geht das nicht da SF_DEBUGOUT ja leider definiert ist (mit void 0), gibt es hier schicke wege das irgendwie doch zu tun?
Wie wäre es mit
Frank
Gast
#3390220
statt:
so:
mit:
wird Block übersprungen mit:
wird Block übersetzt
Gast
#3390221
Vielen Dank für die Tips. btw, das muss scheinbar so aussehen, zumindest macht microchip das in ihrer appio.h :-)
eh, wir haben aber nicht aneinander vorbei geredet? Was ich da Plane ist das er die sachen nicht mehr mit ein compiled, sprich die debug funktionen komplett raus nimmt. David Mueller schrieb: > Vielen Dank für die Tips. > > btw, das muss scheinbar so aussehen, zumindest macht microchip das in > ihrer appio.h :-) > >
> > > eh, wir haben aber nicht aneinander vorbei geredet? Doch, ich denke schon. Dir geht es darum, wie du mit diesem #define dann die eigentliche Funktion aus dem Compilat auch noch entfernen kannst. Zu diesem Zwecke mach dir klar, dass es einen Unterschied zwischen
und
gibt. Ersteres fragt lediglich ab, ob es ein Makro gibt. Letzteres kannst du zb verwenden um auch noch den Wert eines Makros auszuwerten
Genauer gesagt, gilt für #if dasselbe was auch für ein normales C-if gilt: Es erwartet einen Ausdruck und der kann 0 oder nicht 0 sein. Je nachdem wird dann vom #if der nachfolgende Textblock mitgenommen oder nicht. David Mueller schrieb: > das muss scheinbar so aussehen Nein, einfach leer lassen sollte genauso gehen. Der Unterschied ist nur, dass das „((void) 0)“ syntaktisch eine Anweisung ist (welche keine Wirkung hat), während beim Leerlassen eine leere Anweisung entsteht (durch das nachfolgende Semikolon, welches man normalerweise hinter dem Makroaufruf noch schreibt). Eine Warnung kann ein Compiler für beide Fälle natürlich generieren, oder eben auch nicht. Da wir hier im GCC-Forum sind: mir ist nicht bekannt, dass GCC eine leere Anweisung warnen würde.
Gast
#3390380
Das geht z.B. so: #ifdef DEBUG #define debug_printf printf #else #define debug_printf(...) #endf
Gast
#3390385
oder in deinem Fall: #ifdef DEBUG #define SF_DEBUGOUT(a,b,c) event_buffer_print(a,b,c) #else #define SF_DEBUGOUT(...) #endif
Gast
#3393021
Ist ein bischen spitzfindig, aber das ((void)0) hat auch seine Vorteile: Mit
lässt sich das folgende Statement auch kompilieren wenn DEBUG nicht gesetzt ist:
Mit
würde der Kompiler einen Fehler melden. Dani Zwirner schrieb: > würde der Kompiler einen Fehler melden. Was ja auch nicht schlimm wäre. Der kanonische Weg, um den Inhalt eines Makros sich so benehmen zu lassen wie eine Funktion ist:
Würde ich aber für den Debug-Kram nur machen, wenn's unbedingt sein muss. Normalerweise stehen solche debug-Print-Anweisungen nur mehr mutterseelenallein auf einer Zeile:
Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|