Forum: Compiler & IDEs Preprozessor #ifdef um eine Funktion ab zu schalten


von David H. (davidm)


Lesenswert?

1
// Debugout funktion verwenden
2
#define SF_DEBUGOUT(text,flash_addr,stats)    event_buffer_print(text,flash_addr,stats);
3
4
// Debugout nicht verwenden (zuminest denke ich das es so geht)
5
#define SF_DEBUGOUT  (void) 0;

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
#ifdef SF_DEBUGOUT   
2
event_buffer_print(text,flash_addr,stats) {
3
4
//.... stuff
5
6
}
7
#endif

von Frank W. (wesoft) Benutzerseite


Lesenswert?

Wie wäre es mit

1
#undef SF_DEBUGOUT

Frank

von def (Gast)


Lesenswert?

statt:
1
#ifdef SF_DEBUGOUT
2
...


so:
1
#if SF_DEBUGOUT
2
...

mit:
1
#define SF_DEBUGOUT 0
wird Block übersprungen

mit:
1
#define SF_DEBUGOUT 1  // eigentlich >0
wird Block übersetzt

von Oliver (Gast)


Lesenswert?

1
#ifdef DEBUG
2
// Debugout funktion verwenden
3
#define SF_DEBUGOUT(text,flash_addr,stats)    event_buffer_print(text,flash_addr,stats);
4
#else
5
// Debugout nicht verwenden (zuminest denke ich das es so geht)
6
#define SF_DEBUGOUT  (void) 0;
7
#endif

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

1
#ifdef DEBUG
2
// Debugout funktion verwenden
3
#define SF_DEBUGOUT(text,flash_addr,stats)    event_buffer_print(text,flash_addr,stats) // *ohne* Semikolon!
4
#else
5
// Debugout nicht verwenden (zuminest denke ich das es so geht)
6
#define SF_DEBUGOUT(text,flash_addr,stats) // einfach nichts hier
7
#endif

von David H. (davidm)


Lesenswert?

Vielen Dank für die Tips.

btw, das muss scheinbar so aussehen, zumindest macht microchip das in 
ihrer appio.h :-)
1
#define SF_DEBUGOUT(ignore,ignore2,ignore3)  ((void) 0)


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.

von Karl H. (kbuchegg)


Lesenswert?

David Mueller schrieb:
> Vielen Dank für die Tips.
>
> btw, das muss scheinbar so aussehen, zumindest macht microchip das in
> ihrer appio.h :-)
>
>
1
> #define SF_DEBUGOUT(ignore,ignore2,ignore3)  ((void) 0)
2
>
>
>
> 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
1
#ifdef
und
1
#if

gibt.
Ersteres fragt lediglich ab, ob es ein Makro gibt.
Letzteres kannst du zb verwenden um auch noch den Wert eines Makros 
auszuwerten
1
#if SF_DEBUGOUT == 0
2
...
3
#endif

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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von avr3 (Gast)


Lesenswert?

Das geht z.B. so:


#ifdef DEBUG
  #define debug_printf  printf
#else
  #define debug_printf(...)
#endf

von avr3 (Gast)


Lesenswert?

oder in deinem Fall:

#ifdef DEBUG
  #define SF_DEBUGOUT(a,b,c) event_buffer_print(a,b,c)
#else
  #define SF_DEBUGOUT(...)
#endif

von Dani Zwirner (Gast)


Lesenswert?

Ist ein bischen spitzfindig, aber das ((void)0) hat auch seine Vorteile:

Mit
1
#ifdef DEBUG 
2
  #define A(x) printf("%i\n", x)
3
#else
4
  #define A(x) (void(0))
5
#endif
lässt sich das folgende Statement auch kompilieren wenn DEBUG nicht 
gesetzt ist:
1
for(int i=0;i<3;i++, A(i))
2
{
3
}

Mit
1
#define A(x)

würde der Kompiler einen Fehler melden.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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:
1
#define A(x) do {} while (0)

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:
1
   DPRINTF("foo failed: %d\n", foo);

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.