Preprozessor #ifdef um eine Funktion ab zu schalten

#3390203
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
Gast #3390221
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
#3390227
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.
#3390319
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.
Moderator Persönliche Seite #3390374
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.
Gast #3393021
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.
Moderator Persönliche Seite #3393099
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);

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren