Si vous avez le code log_out()
, réécrivez-le. Très probablement, vous pouvez faire:
static FILE *logfp = ...;
void log_out(const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
vfprintf(logfp, fmt, args);
va_end(args);
}
Si des informations de journalisation supplémentaires sont nécessaires, elles peuvent être imprimées avant ou après le message affiché. Cela permet d'économiser l'allocation de mémoire et les tailles de tampon douteuses et ainsi de suite. Vous devez probablement initialiser logfp
à zéro (pointeur nul) et vérifier s'il est nul et ouvrir le fichier journal le cas échéant - mais le code existant log_out()
devrait de toute façon s'occuper de cela.
L'avantage de cette solution est que vous pouvez simplement l'appeler comme s'il s'agissait d'une variante de printf()
; en effet, il s'agit d'une variante mineure sur printf()
.
Si vous n'avez pas le code log_out()
, demandez-vous si vous pouvez le remplacer par une variante telle que celle décrite ci-dessus. La possibilité d'utiliser le même nom dépendra de la structure de votre application et de la source ultime de la log_out()
fonction actuelle . S'il se trouve dans le même fichier objet qu'une autre fonction indispensable, vous devrez utiliser un nouveau nom. Si vous ne parvenez pas à la répliquer exactement, vous devrez utiliser une variante comme celles données dans d'autres réponses qui allouent une quantité appropriée de mémoire.
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? */
}
De toute évidence, vous appelez maintenant la log_out_wrapper()
place de log_out()
- mais l'allocation de mémoire et ainsi de suite est effectuée une fois. Je me réserve le droit de surallouer de l'espace d'un octet inutile - je n'ai pas revérifié si la longueur renvoyée par vsnprintf()
inclut le null de fin ou non.