J'essaye d'écrire une enveloppe autour de la fonction vfprintf
mais avec l'exigence que je veux ajouter un préfixe au spécificateur de format et puis passer le nouveau spécificateur de format à vfprintf
.Comment écrire un wrapper vfprintf qui ajoute un préfixe à un spécificateur de format et passe le nouveau spécificateur de format à vfprintf dans C89?
Maintenant, je ne sais pas comment faire cela, mais j'ai capturé mon intention dans le code suivant.
#include <stdio.h>
#include <stdarg.h>
void err(const char *format, ...)
{
va_list args;
va_start(args, format);
vfprintf(stderr, "foo: error:" format, args);
va_end(args);
}
int main()
{
err("%s: %d\n", "Transaction failed with error code", 42);
return 0;
}
Vous pouvez voir dans le code ci-dessus, que je veux préfixe "foo: error"
au spécificateur de format et de passer ensuite à vprintf
. Ce code, bien sûr, conduirait à une erreur de compilation car ce code n'est pas valide. Cela capture seulement mon intention de ce que j'essaye d'accomplir.
[email protected]:~/lab/c$ gcc -std=c89 -Wall -Wextra -pedantic vfprintf-wrapper.c
vfprintf-wrapper.c: In function ‘err’:
vfprintf-wrapper.c:8:36: error: expected ‘)’ before ‘format’
vfprintf(stderr, "foo: error:" format, args);
^
vfprintf-wrapper.c:8:5: error: too few arguments to function ‘vfprintf’
vfprintf(stderr, "foo: error:" format, args);
^
Pouvez-vous m'aider à écrire ce code correctement?
Cela ressemble à une chose inutilement compliquée à faire. Pourquoi ne pas simplement imprimer le préfixe d'erreur dans une instruction séparée à l'intérieur du wrapper, puis appeler vprintf tel quel? –
@ n.m. C'est une manière parfaitement valide de faire les choses, cependant, je veux apprendre si ce que je demande est possible et comment le faire. –
Bien sûr, c'est possible. Il suffit de créer une nouvelle chaîne de format (malloc et un couple de strcpys le feraient). Mais ce n'est probablement pas la solution la plus efficace. – rici