Preprozessor #ifdef um eine Funktion ab zu schalten

OP #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
OP #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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.