0
votes

Problème dans la rédaction d'une enveloppe à imprimerf en C pour mettre en place une impression fluchuée?

Je veux utiliser Printf pour un débogage de base (oui, je connais avec GDB, etc.). En tant que tampons d'impression, un appel à fflush (stdout) est requis immédiatement après un imprimeur. J'ai pensé à écrire un wrapper simple. Donc, l'enveloppe sera quelque chose comme ceci: xxx

Je pense que la mise en œuvre d'une telle fonction serait quelque chose comme ceci: xxx

Je sais qu'il y a des fonctions / macros comme Va_List, VA_START et VA_ARGS, mais ceux-ci vous obligeront à analyser la chaîne de format Printf pour obtenir le type et je veux éviter de le faire. Y a-t-il une approche simple? Comme cela n'est que pour le débogage des objectifs, cela ne me dérange pas que le type de format soit limité à% D,% f et% s.


0 commentaires

3 Réponses :


3
votes

Il suffit d'utiliser SETVBUF CODE> et définissez le flux à la ligne tamponnée tamponnée.

void flushedPrintf(const char *fmt, ...) {
   va_list va;
   va_start(va, fmt);
   vprintf(fmt, va);
   va_end(va);
   fflush(stdout);
   // TODO: propagate return value from vprintf and fflush
}


2 commentaires

printf retourne int. wrapper devrait faire la même chose


@P__J____ c'est mon erreur. J'avais demandé si dans la question.



1
votes

utiliser stardr et fprintf. Starr est ignorée par défaut.

Cette question est répondue dans un meilleur détail ici:

Pourquoi Printf n'est-il pas affleurant après l'appel que si une nouvelle ligne est dans la chaîne de format?


0 commentaires

1
votes

comme une extension (et peut-être une certaine correction) à la réponse @kamilcuk.

Si vous utilisez le compilateur de la famille GCC, vous pouvez utiliser l'attribut de fonction spécial indiquant le compilateur que la fonction est de type imprimable. Le compilateur analysera la chaîne de format et émettra les avertissements - identique à l'utilisation de printf. xxx

https://godbolt.org/z/sbgrxk


0 commentaires