Si vous avez le code pour log_out()
réécrivez-le. Très probablement, vous pouvez le 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 aurez probablement besoin d'initialiser logfp
à zéro (pointeur nul) et de vérifier s'il est nul et d'ouvrir le fichier journal comme il se doit - mais le code dans la version existante de l log_out()
devrait s'occuper de ça de toute façon.
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 de printf()
.
Si vous n'avez pas le code pour log_out()
Dans ce cas, il est possible de le remplacer par une variante telle que celle décrite ci-dessus. La possibilité d'utiliser le même nom dépendra de votre cadre d'application et de la source ultime de l'objet actuel. log_out()
fonction. Si elle 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 reproduire exactement, vous devrez utiliser une variante comme celles données dans d'autres réponses qui alloue 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? */
}
Évidemment, vous appelez maintenant le log_out_wrapper()
au lieu de log_out()
- mais l'allocation de mémoire et tout le reste est fait une fois. Je me réserve le droit de surallouer l'espace d'un octet inutile - je n'ai pas vérifié deux fois si la longueur retournée par vsnprintf()
inclut ou non la terminaison null.
1 votes
Je suis sûr que le prototype de la fonction est bien : extern void log_out(const char *, ...) ; car si ce n'est pas le cas, l'appel à cette fonction est erroné (trop d'arguments). Elle devrait prendre un pointeur constant car il n'y a aucune raison pour que log_out() modifie la chaîne de caractères. Bien sûr, vous pourriez dire que vous voulez passer une seule chaîne de caractères à la fonction - mais vous ne pouvez pas. Une option consiste alors à écrire une version varargs de la fonction log_out().