Forum: PC-Programmierung C: makro extern laden


von dotm (Gast)


Lesenswert?

Hallo.
Ich überlege mir derzeit wie ich am galantesten eine konfigurierbare 
debug-Ausgabe in meinem Code erledige.
Schön wäre es wenn so wenig wie möglich Platz im Code dafür eingenommen 
wird.
Ich habe printf zunächst mal umgeleitet (USART).
Jetzt könnte ich also z.B. im modul spezialfunktionen.c
1
void funktion_eins(uebergabe1)
2
{
3
int test;
4
//hier passiert irgendwas
5
printf("%i",test);
6
}
eine Debugausgabe machen.

Jetzt will ich aber dass die Ausgabe nur dann passiert wenn das auch 
gewünscht, bzw so eingestellt ist. Z.B. mit der variable 
debug_spezialfunktionen. Dazu mach ich mir also ein Makro:
1
#define DEBUG_OUT(printf_parameters) if(debug_spezialfunktion) printf((printf_parameters));
2
3
debug_spezialfunktion = 1;
4
5
void funktion_eins(uebergabe1)
6
{
7
int test;
8
//hier passiert irgendwas
9
DEBUG_OUT("%i",test);
10
}

Soweit so gut. Mir ist nun aufgefallen dass in allen meinen .c Dateien 
das Makro gleich aussieht wenn man den Vergleichsparameter noch vorher 
per Präprozessor definiert.

Für spezialfunktionen.c wäre das z.B.
1
#define DEBUG_VERGLEICH debug_spezialfunktion
2
#define DEBUG_OUT(printf_parameters) if(DEBUG_VERGLEICH) printf((printf_parameters));

Oder auch für spezialalgorithmen.c
1
#define DEBUG_VERGLEICH debug_spezialalgorithmen
2
#define DEBUG_OUT(printf_parameters) if(DEBUG_VERGLEICH) printf((printf_parameters));

jetzt wäre es doch irgendwie nett wenn ich die zeile
1
#define DEBUG_OUT(printf_parameters) if(DEBUG_VERGLEICH) printf((printf_parameters));

von einer datei debugmakros.c laden könnte und zwar nach
1
#define DEBUG_VERGLEICH debug_spezialalgorithmen

sodass ich gegebenfalls das makro DEBUG_OUT ändern kann (z.B. 
zeitstempel einfügen o.ä.) und das wird dann auf alle Funktionen 
angewandt.
Lässt sich das irgendwie bewerkstelligen?

von Dr. Sommer (Gast)


Lesenswert?

Kennst du schon #include?
Macros.h (Header!! nicht .c):
1
#define DEBUG_OUT(printf_parameters) if(DEBUG_VERGLEICH) printf((printf_parameters));

Und dann in deinen .c Files:
1
#include "Macros.h"

Ob das vor oder nach dem "#define DEBUG_VERGLEICH 
debug_spezialalgorithmen" steht ist übrigens egal.

von dotm (Gast)


Lesenswert?

danke Dr.Sommer!
mein Bedenken war eben dass DEBUG_VERGLEICH auf die art nicht korrekt 
substituiert wird.

von Dr. Sommer (Gast)


Lesenswert?

dotm schrieb:
> mein Bedenken war eben dass DEBUG_VERGLEICH auf die art nicht korrekt
> substituiert wird.
es wird aber. sowas kann man auch ausprobieren.

von dotm (Gast)


Lesenswert?

okay cool!
Das einzige Problemchen ist natürlich dass mit zunehmender Komplexität 
des DEBUG_OUT Makros der Code grösser wird, da das ganze ja jedesmal das 
gesamte eingefügt wird.
Gibt es eine Möglichkeit eine Funktion sagen wir mal debug_printf() die 
gesamten Paramter von printf zu übergeben?
also
1
void debug_printf(printfparameters)
2
{
3
printf (timestamp);
4
printf (printfparameters);
5
}

von Dr. Sommer (Gast)


Lesenswert?

dotm schrieb:
> Gibt es eine Möglichkeit eine Funktion sagen wir mal debug_printf() die
> gesamten Paramter von printf zu übergeben?
http://man7.org/linux/man-pages/man3/stdarg.3.html

vprintf: http://man7.org/linux/man-pages/man3/printf.3.html

von dotm (Gast)


Lesenswert?

AH! ist mir bisweile entgangen! damit erpar ich mir natürlich das Makro.
alles super! danke und grüsse.
m.

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.