PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Leere Funktionen aufrufen



axeljaeger
12-04-2003, 17:57
Ich versuche gerade eine Library zu entwickeln und denke daran, zu Debugzwecken eine Funktion zu bauen,
die Informationen über die Kommandozeile ausgibt, allerdings nur, wenn ein Compilerschalter definiert ist.
Nun bieten sich mir zwei Möglichkeiten an:

1. Eine Version, die den Körper einer Methode nur ausführt, wenn ein flag definiert ist, so etwa:




void printdbg(const char* what)
{
#ifdef DEBUG
printf("Debug: %s",what);
#endif
}



2. Ein Makro, was leer wird, wenn ein Flag definiert ist:

[CODE

#ifdef DEBUG
#define printdbg(a) printf("Debug: %s",what);
#else
#define printdbg(a)
#endif

[/CODE]

Beides hat Vor- und Nachteile. Das erste wäre halt eine gescheite Funktion, hätte aber den Nachteil, das ich,
wenn ich als release kompiliere, jede Menge leere Methodenaufrufe habe, oder optimiert die der Compiler weg?
Das zweite wäre halt komplett weg, aber man sagt ja, Makros sind ein bißchen unsauber, außerdem kann ich das
dann in meiner Dokumentation nicht als richtige Funktion angeben, es findet ja keine Überprüfung auf richtige
Argumenttypen statt. Außerdem können gängige Dokumentationstools glaub ich nicht so viel damit anfangen.
Gibt es evtl. noch eine dritte gescheite Lösung, oder mache ich mir hier Gedanken über nichtrelevante, evtl.
eingesparte Nanosekunden?

anda_skoa
12-04-2003, 18:30
Hmm, in C++ könnte man die Funktion als inline deklarieren.
Dann würde sie bei leerem Body ziemlich sicher weg optimiert.

In C kann man ja die Version mit dem leeren Macro machen, da sind Macros ohnehin üblich.

Ciao,
_

axeljaeger
12-04-2003, 19:19
soll schon für C++ sein. Das mit dem Makro hätte den Vortiel, das man noch mehr Zeug einbauen kann: Zeilennummer, usw.

anda_skoa
12-04-2003, 22:06
hmm, stimmt.

Ich denke du machst es am besten mit einem Macro.
Selbst bei inline ist nicht sicher, dass es der Compiler inlined.

Eventuell wäre es aber sinnvoll, fprintf mit stderr zu benutzen, das ist nicht gepuffert.

Ciao,
_

BLUESCREEN3D
14-04-2003, 15:47
funzt das?



#ifdef DEBUG
void printdbg(const char* what)
{
printf("Debug: %s",what);
}
#else
#define printdb(a)
#endif