mikrocontroller.net

Forum: Compiler & IDEs funktion mit Hilfe von #ifdef variieren?


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Paul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 Moderator
Autor: Bernd K. (prof7bit)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Beispiel kann man ohne #else hinschreiben. Aber ja, das kann man 
machen.

Autor: Paul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Bernd K. (prof7bit)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Paul schrieb:
> wird der Compiler meckern,
> dass die Funktion nicht definiert ist, oder?

Mach das #ifdef ins Innere der Funktion.

Autor: Heinz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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"));

Autor: Rufus Τ. F. (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert

void DebugAusgabe(int Wert)
{
#ifdef DEBUG
  Serial.print(Wert);
#endif
}

Die Variante, gleich den Aufruf zu vermeiden, wie von Heinz gezgeigt, 
ist meistens vorteilhafter.

Autor: Markus F. (mfro)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
debug.h:
#ifdef DEBUG
#include <stdio.h>

#define dbg(format, arg...) do { printf("DEBUG (%s()): " format, __FUNCTION__, ##arg);} while(0)
#else
#define dbg(format, arg...) do {;} while (0)
#endif /* DEBUG */

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
1 lesenswert
nicht lesenswert
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
 dbg ("Hallo");
was zu einem Syntax-Fehler führt weil es expandiert zu
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
Autor: Paul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank euch allen, alles klar:-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.