Wenn Sie den Code dazu haben log_out()
, schreiben Sie ihn neu. Höchstwahrscheinlich können Sie Folgendes tun:
static FILE *logfp = ...;
void log_out(const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
vfprintf(logfp, fmt, args);
va_end(args);
}
Wenn zusätzliche Protokollierungsinformationen erforderlich sind, können diese vor oder nach der angezeigten Nachricht gedruckt werden. Dies spart Speicherzuordnung und zweifelhafte Puffergrößen und so weiter und so fort. Sie müssen wahrscheinlich logfp
auf Null initialisieren (Nullzeiger) und prüfen, ob es Null ist, und die Protokolldatei entsprechend öffnen - aber der Code in der vorhandenen log_out()
sollte sich trotzdem darum kümmern .
Der Vorteil dieser Lösung ist, dass Sie sie einfach so nennen können, als wäre sie eine Variante von printf()
; in der Tat ist es eine kleine Variante auf printf()
.
Wenn Sie nicht über den Code verfügen log_out()
, prüfen Sie, ob Sie ihn durch eine Variante wie die oben beschriebene ersetzen können. Ob Sie denselben Namen verwenden können, hängt von Ihrem Anwendungsframework und der endgültigen Quelle der aktuellen log_out()
Funktion ab. Wenn es sich in derselben Objektdatei befindet wie eine andere unverzichtbare Funktion, müssten Sie einen neuen Namen verwenden. Wenn Sie nicht herausfinden können, wie Sie es genau replizieren können, müssen Sie eine Variante verwenden, wie sie in anderen Antworten angegeben ist, die eine angemessene Menge an Speicher zuweist.
void log_out_wrapper(const char *fmt, ...)
{
va_list args;
size_t len;
char *space;
va_start(args, fmt);
len = vsnprintf(0, 0, fmt, args);
va_end(args);
if ((space = malloc(len + 1)) != 0)
{
va_start(args, fmt);
vsnprintf(space, len+1, fmt, args);
va_end(args);
log_out(space);
free(space);
}
/* else - what to do if memory allocation fails? */
}
Natürlich rufen Sie jetzt das log_out_wrapper()
anstelle von auf log_out()
- aber die Speicherzuweisung usw. erfolgt einmal. Ich behalte mir das Recht vor, Speicherplatz um ein unnötiges Byte zu überschreiben. Ich habe nicht überprüft, ob die von zurückgegebene Länge vsnprintf()
die abschließende Null enthält oder nicht.