Forum: Mikrocontroller und Digitale Elektronik Debug-Funktionen wegdefinieren


von Chris R. (mrgreen)


Lesenswert?

Hallo,
ich habe Funktionen, die nur dem Debug dienen.
Die sollen jetzt weg-definiert werden. Und zwar will ich nicht jeden 
Functioncall in ein ifdef packen, sondern ihn z.B. durch ein NOP 
ersetzen, das der Optimierer rausschmeißt.
Ich weiß, dass es geht, nur nicht mehr wie :(
Etwa so:
1
uart.h:
2
3
#ifndef DEBUG
4
    #define void uart_send(char c) NOP
5
#else
6
    void uart_send(char c);
7
#endif

Wie muss die genaue Syntax ausschauen...?

MfG
Mr.Green

von (prx) A. K. (prx)


Lesenswert?

Deinen merkwürdigen Mix aus C und Präprozessor verstehe ich nicht recht. 
Bei mir sehen Debug-Ausgaben beispielsweise so aus:

#if DEBUG
  #define trace(s, ...) rprintf(s, ## _VA_ARGS_)
#else
  #define trace(s, ...)
#endif

oder bei AVR für Text im ROM:

#if DEBUG
  #define trace(s, ...) { static char __s[] PROGMEM = (s); \
                          printf_P(__s, ## _VA_ARGS_); }
#else
  #define trace(s, ...)
#endif

und dann eben
  trace("wasauchimmer=%d\n", n);

Ich habe allerdings grad nicht parat, ob varargs #define in C99 drin 
sind sind, oder nur GNU-C, jedenfalls ist das nicht C89.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

A. K. wrote:

> oder bei AVR für Text im ROM

Oder
1
 
2
#if DEBUG
3
#    define trace(s,...)   printf_P (PSTR(s) , ##z)
4
#else
5
#    define trace(...)     (void) 0
6
#endif

Um Warnungen etc zu vermeiden bei
1
    if (x)
2
        trace (a, b);
3
    else
4
        ...

Die Leerzeichen um das , sind wichtig, damit es auch für
1
    trace ("Hallo");

funktioniert.

Bei einem Block im Makro sollte man besser
1
#define X(Y) \
2
   do { c-code } while(0)

schreiben anstatt
1
#define X(Y) \
2
   { c-code }

weil man in der Quelle gewohnt ist, X; zu schreiben and nicht X
1
    if (x)
2
        X(0);
3
    else
4
        x = 1;

von (prx) A. K. (prx)


Lesenswert?

Johann L. wrote:

> #    define trace(s,...)   printf_P (PSTR(s) , ##z)

Lag nahe, funktioniert(e) aber bei C++ nicht. Daher die andere Version.

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.