Se hai il codice per log_out()
, riscrivilo. Molto probabilmente puoi fare:
static FILE *logfp = ...;
void log_out(const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
vfprintf(logfp, fmt, args);
va_end(args);
}
Se sono necessarie ulteriori informazioni di registrazione, è possibile stamparle prima o dopo il messaggio visualizzato. Ciò consente di risparmiare allocazione di memoria e dimensioni di buffer dubbie e così via. Probabilmente è necessario inizializzare logfp
a zero (puntatore nullo) e verificare se è nullo e aprire il file di registro come appropriato, ma il codice esistente log_out()
dovrebbe occuparsene comunque.
Il vantaggio di questa soluzione è che puoi chiamarla semplicemente come se fosse una variante di printf()
; anzi, è una variante minore di printf()
.
Se non hai il codice log_out()
, valuta se puoi sostituirlo con una variante come quella descritta sopra. La possibilità di utilizzare lo stesso nome dipenderà dal framework dell'applicazione e dall'origine definitiva della log_out()
funzione corrente . Se è nello stesso file oggetto di un'altra funzione indispensabile, dovresti usare un nuovo nome. Se non riesci a capire come replicarlo esattamente, dovrai usare qualche variante come quelle fornite in altre risposte che alloca una quantità appropriata di memoria.
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? */
}
Ovviamente, ora chiami log_out_wrapper()
invece di log_out()
- ma l'allocazione della memoria e così via viene eseguita una volta. Mi riservo il diritto di sovra-allocare lo spazio di un byte non necessario - non ho ricontrollato se la lunghezza restituita da vsnprintf()
include il null finale o meno.