Forum: Compiler & IDEs #define DEBUG(.)?


von Programierer (Gast)


Lesenswert?

Hallo Zusammen,

ich bin bei einem Code auf folgende Zeilen gestoßen:
1
//#define DEBUG usart_write  //mit Debugausgabe
2
#define DEBUG(...)           //ohne Debugausgabe
3
4
DEBUG("Hallo\n\r");

die Funktion ist mir grundsätzlich klar.
wenn gewünscht ersetzt das obere define "debug" durch "usart_write" und 
über die UART wird "Hallo" ausgegeben.
Bei "define DEBUG(...)" wird entsprechend nichts ausgegeben.

Aber was bedeuteted ?
1
#define DEBUG(...)
Debug kann ja nicht (...) zugewisen werden da das Leerzeichen fehlt.

von Fred (Gast)


Lesenswert?

Das ist ein variadisches Makro.

Kennst du (...) in der Parameterliste von Funktionen, beispielsweise bei 
printf. Das ist dasselbe für Makros.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Das bedeutet, daß "DEBUG()" mit beliebig vielen Argumenten durch 
-nichts- ersetzt wird.

von Programierer (Gast)


Lesenswert?

Vielen Dank für die schnellen Antworten.

Den Code habe ich von einem AVR der mit GCC compiliert wird.
Ich habe versucht das ganze auf einen PIC18 mit CCS compiler zu 
portieren.
Funktioniert leider nicht.

kann es sein dass der CCS compiler solche makros nicht unterstützt?

von Rolf Magnus (Gast)


Lesenswert?

Programierer schrieb:
> Vielen Dank für die schnellen Antworten.
>
> Den Code habe ich von einem AVR der mit GCC compiliert wird.
> Ich habe versucht das ganze auf einen PIC18 mit CCS compiler zu
> portieren.
> Funktioniert leider nicht.
>
> kann es sein dass der CCS compiler solche makros nicht unterstützt?

Möglich. Vielleicht kann der kein C99, oder man muß es erst irgendwie 
einschalten. Makros mit variabler Argumentliste wurden nämlich erst dort 
offizieller Sprachbestandteil.

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


Lesenswert?

Rolf Magnus schrieb:
> Makros mit variabler Argumentliste wurden nämlich erst dort offizieller
> Sprachbestandteil.

Davor musste man sich deutlich umständlicher helfen.  Entweder so:
1
#ifdef USE_DEBUG
2
#  define DEBUG1(arg1) printf(arg1)
3
#  define DEBUG2(arg1, arg2) printf(arg1, arg2)
4
#  define DEBUG3(arg1, arg2, arg3) printf(arg1, arg2, arg3)
5
/* so viele, wie benötigt werden */
6
#else
7
#  define DEBUG1(arg1)
8
#  define DEBUG2(arg1, arg2)
9
#  define DEBUG3(arg1, arg2, arg3)
10
#endif

Oder mit doppelter Klammerung:
1
#ifdef USE_DEBUG
2
#  define DEBUG(arg) printf arg
3
#else
4
#  define DEBUG(arg)
5
#endif
6
7
/* ... */
8
  DEBUG(("could not do foo: %s", reason));

von Stefan R. (srand)


Lesenswert?

Man könnte auch eine variadische Funktion definieren, die nichts macht 
(variadische Funktionen sind schließlich "schon immer" verfügbar), und 
dann das Debug-Makro dahin definieren.

Das abschließende Semikolon ist bei den Verwendungen ja offenbar 
gegeben, dann sollte das klappen.

von Hans (Gast)


Lesenswert?

Stefan Rand schrieb:
> Man könnte auch eine variadische Funktion definieren, die nichts macht
> (variadische Funktionen sind schließlich "schon immer" verfügbar), und
> dann das Debug-Makro dahin definieren.

Sähe dann in etwa so aus:
1
static void do_nothing(...) {}
2
//#define DEBUG usart_write  //mit Debugausgabe
3
#define DEBUG do_nothing     //ohne Debugausgabe
4
5
DEBUG("Hallo\n\r");

von sebastian (Gast)


Lesenswert?

Hans schrieb:
> Sähe dann in etwa so aus:
> static void do_nothing(...) {}

Fast. Variadische Funktinen ganz ohne festen Parameter sind nicht 
erlaubt.

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.