Hallo zusammen, ich hab mal ne Frage: Ich würde gerne Debug-Code ausgeben, aber nur wenn ein DEBUG-Modus definiert ist. Ich habe an zahlreichen Stellen im Code solche Debug-Ausgaben, und möchte dort nicht jedes mal eine if-Bedingung abfragen. Deswegen wäre jetzt mein Ansatz: Ich schreibe eine kleine Funktion, der ich dann die Werte zum Ausgeben übergebe. Im Falle, dass DEBUG ausgeschalten ist, gibt es dann eine Variante der Funktion, die eben nichts ausspuckt. Ist das so ein empfehlenswerter Zugang? Beispielcode: #define DEBUG #ifdef DEBUG void DebugAusgabe(int Wert){ Serial.print(Wert); } #else void DebugAusgabe(int Wert){ } #endif
:
Verschoben durch User
Das Beispiel kann man ohne #else hinschreiben. Aber ja, das kann man machen.
Bernd K. schrieb: > Das Beispiel kann man ohne #else hinschreiben. Aber ja, das kann man > machen. Da hast du schon Recht, aber wenn ich im Programmcode dann an mehreren Stellen die Funktion DebugAusgabe() aufrufe, wird der Compiler meckern, dass die Funktion nicht definiert ist, oder?
Paul schrieb: > wird der Compiler meckern, > dass die Funktion nicht definiert ist, oder? Mach das #ifdef ins Innere der Funktion.
Paul schrieb: > Ich würde gerne Debug-Code ausgeben, aber nur wenn ein DEBUG-Modus > definiert ist. VOID debugPrintf(CHAR *pString) { Serial.println(pString); } #ifdef(DEBUG) #define DBGPRINT(a) debugPrintf a #else #define DBGPRINT(a) #endif DBGPRINT(("Hallo"));
1 | void DebugAusgabe(int Wert) |
2 | {
|
3 | #ifdef DEBUG
|
4 | Serial.print(Wert); |
5 | #endif
|
6 | }
|
Die Variante, gleich den Aufruf zu vermeiden, wie von Heinz gezgeigt, ist meistens vorteilhafter.
debug.h:
1 | #ifdef DEBUG
|
2 | #include <stdio.h> |
3 | |
4 | #define dbg(format, arg...) do { printf("DEBUG (%s()): " format, __FUNCTION__, ##arg);} while(0)
|
5 | #else
|
6 | #define dbg(format, arg...) do {;} while (0)
|
7 | #endif /* DEBUG */ |
Markus F. schrieb: > #define dbg(format, arg...) do { printf("DEBUG (%s()): ", > format, __FUNCTION__, ##arg);} while(0) Wobei das eine GNU-Erweiterung ist: In den variadischen Makros ab C99 bezieht sich __VA_ARGS__ auf die variablen Argumente, die dann mit ... angegeben werden müssen. Im Kontext von oben macht das aber Probleme wenn keine extra Argumente übergeben werden wie in
1 | dbg ("Hallo"); |
was zu einem Syntax-Fehler führt weil es expandiert zu
1 | printf("DEBUG (%s()): " format, __FUNCTION__,); |
Hierzu dient die GNU-Erweiterung, welche bei leerem arg... das Komma vor ##arg "auffrisst", so dass es nicht mehr zu einem Fehler kommt. Ich kenn jetzt kein anderes Konstrukt, das vorhandenen Code (hier ein ,) entfernt...
:
Bearbeitet durch User
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.