Note: Le code source complet pour les exemples de ce tutoriel peut être téléchargée à la fin du tutoriel. Introduction
La fonction printf () et ses cousins sont parmi les plus polyvalents et fonctions bien connues pour l'envoi de chaînes de caractères formatée comme les fichiers de sortie et l'écran. Ils sont mis en œuvre par beaucoup de langages, dont C, Java, Perl, PHP, Python, Ruby, et une poignée d'autres.
L'un de printf () s la signature des avantages est sa capacité à accepter un certain nombre d'arguments variable. Cela permet de contenir du texte imprimé en d'innombrables variations de valeurs mises en forme et les cordes. Dans ce tutoriel, vous apprendrez comment étendre cette fonctionnalité pour créer vos propres printf () fonction wrapper.
Pourquoi voudrions-nous faire? Une des raisons les plus évidente serait de créer notre propre avertissement () ou d'erreur () fonctions qui agissent comme printf () mais peut être conditionnelle allumé ou éteint par, disons, du compilateur ou les arguments de ligne de commande. Cela nous épargnerait le besoin d'envelopper les déclarations individuelles de débogage dans des blocs conditionnels, en réduisant la taille du code et sa complexité.
Ce tutoriel va vous expliquer comment faire en C.
Nos Silver Bullet: vprintf ()
Le secret de notre réussite ici est printf () s proche cousin, vprintf (). Cette fonction fait la même chose que printf (), mais en diffère par la façon dont il accepte les arguments. Comme nous le savons, printf () accepte une chaîne de format, puis un nombre variable d'arguments. vprintf (), d'autre part accepte une chaîne de format et un pointeur vers une liste d'arguments. C'est ce second argument qui nous permet de passer facilement tous les arguments de notre fonction dans printf ().
En C, il faut inclure un en-tête de fichier supplémentaire pour accomplir ceci: stdarg.h. Ce fichier contient les
va_list type, qui est essentiellement un pointeur à notre liste d'arguments. Il contient également les fonctions
va_start () et
va_end () , Qui nous fournissent l'accès à ces arguments. Voici un exemple de fonction en C qui prend les mêmes arguments que printf () et passe simplement sur vprintf ().
#include <stdio.h>
#include <stdarg.h>
void printThis( const char* format, ... ) {
va_list args;
va_start( args, format );
vprintf( stderr, format, args );
va_end( args );
}
- #include <stdio.h>
- #include <stdarg.h>
-
- void printThis( const char* format, ... ) {
- va_list args;
- va_start( args, format );
- vprintf( stderr, format, args );
- va_end( args );
- }
Pour spécifier un nombre variable d'arguments dans une fonction, la "..." Mot-clé est utilisé. Cela indique au compilateur que n'importe quel nombre d'arguments mai suivre les
format paramètre.
Putting It All Together
Maintenant que weve a conclu avec succès printf () dans notre propre fonction, permet d'aller de l'avant et créer notre propre erreur () qui se comporte exactement comme printf (), mais affiche l'erreur standard et affiche "Error:" avant que nos messages. Tout comme avec fprintf (), nous pouvons utiliser vfprintf () pour spécifier le fichier de sortie (dans ce cas, stderr) et imprimer à l'aide de la chaîne de format spécifié et arguments.
#include <stdio.h>
#include <stdarg.h>
void error( const char* format, ... ) {
va_list args;
fprintf( stderr, "Error: " );
va_start( args, format );
vfprintf( stderr, format, args );
va_end( args );
fprintf( stderr, "\n" );
}
- #include <stdio.h>
- #include <stdarg.h>
-
- void error( const char* format, ... ) {
- va_list args;
- fprintf( stderr, "Error: " );
- va_start( args, format );
- vfprintf( stderr, format, args );
- va_end( args );
- fprintf( stderr, "\n" );
- }
Thats tous là est à lui. Vous pouvez appeler error () le chemin exactement les mêmes que vous appelleriez printf (). Comme je l'ai mentionné précédemment, vous pouvez entourer sa définition par une conditionnelle de sorte que la production ne sera généré si le drapeau donné est définie. Utile, hein?
Conclusion
Vous devriez maintenant savoir comment créer votre propre fonction wrapper pour printf () afin de le personnaliser selon vos besoins. Gardez à l'esprit que vous pouvez créer des fonctions avec des arguments de longueur variable à des fins de bien d'autres.
Vous mai trouver les ressources utile lorsque vous travaillez avec la fonction printf () de la famille de fonctions:
printf () ,
fprintf () ,
vprintf () ,
vfprintf () J'ai toujours les bienvenus questions ou des commentaires sur ce tutoriel. Il suffit de poster une réponse ou PM moi, im glad to help!
printf_c.zip
(608 Octets) Téléchargé 1645 fois
Complete source code for the example in this tutorial.