VA_ARG |
Argument |
---|---|
Langage C++ | cstdarg (stdarg.h) |
Syntaxe
type va_arg(va_list ptrargument,type) |
Paramètres
Nom | Description |
---|---|
ptrargument | Ce paramètre permet d'indiquer le pointeur de paramètre. |
type | Ce paramètre permet d'indiquer le type |
Description
Cette fonction donne l'argument (le paramètre) suivant de la fonction.
Remarques
- Les fonctions va_arg(), va_start() et va_end() fonctionnent ensemble pour permettre à un nombre variable d'arguments d'être transmis à une fonction. L'exemple le plus courant d'une fonction prenant un nombre variable de paramètres est printf(). Le type va_list est défini par «cstdarg».
- La procédure générale de création d'une fonction pouvant accepter un nombre variable d'arguments est la suivante. La fonction doit avoir au moins un paramètre connu, mais peut en avoir plus avant la liste des paramètres variables. Le paramètre connu le plus à droite est appelé last_parm. Le nom de last_parm est utilisé comme deuxième paramètre dans un appel à va_start(). Avant d'accéder à l'un des paramètres de longueur variable, le pointeur de paramètre ptrargument doit être initialisé via un appel à la fonction va_start(). Après cela, les paramètres sont retournés via des appels à va_arg(), avec type étant le type du paramètre suivant. Enfin, une fois que tous les paramètres ont été lus et avant de revenir de la fonction, un appel à va_end() doit être effectué pour s'assurer que la pile est correctement restaurée. Si la fonction va_end() n'est pas appelé, un plantage du programme est très probable.
- Définition et utilisation : La fonction va_arg est utilisée pour accéder aux paramètres d'une fonction acceptant un nombre variable de paramètres. Cette fonctionnalité est couramment utilisée dans les fonctions comme printf, où le nombre de paramètres n'est pas fixe. Elle fait partie de la famille de macros définies dans l'entête <cstdarg> et permet de traiter les paramètres de manière dynamique, rendant les fonctions plus flexibles.
- Utilisation avec va_list : Avant d'utiliser va_arg, il est nécessaire de déclarer une variable de type va_list, devant être initialisée avec la macro va_start. Cela établit un point de départ pour accéder aux arguments variables. Exemple :
- Type des paramètres : Il est important que le type spécifié dans va_arg corresponde au type réel du paramètre passé à la fonction. Si un type incorrect est spécifié, cela peut entraîner des comportements indéfinis et des erreurs d'exécution. Par exemple, si un paramètre est passé comme double, mais que vous utilisez va_arg pour le récupérer comme int, cela causera un problème de lecture de mémoire.
- Limitation sur le nombre de paramètres : La macro va_arg ne fournit pas d'information sur le nombre de paramètres passés. Le programmeur doit donc s'assurer qu'il connaît le nombre de paramètres attendus ou utiliser un mécanisme alternatif pour les limiter. Cela implique souvent de passer un argument supplémentaire, comme un entier représentant le nombre d'arguments, comme dans l'exemple précédent.
- Gestion de la mémoire : Les macros va_start et va_end doivent être utilisées correctement. va_start initialise la liste de paramètres, tandis que va_end doit être appelé à la fin de l'utilisation de la liste pour effectuer un nettoyage. Cela aide à prévenir les fuites de mémoire et garantit que la gestion des arguments variables est correcte et propre.
- Portabilité et compatibilité : Bien que va_arg soit une fonctionnalité standard dans le langage de programmation C et C++, il peut y avoir des différences dans la manière dont les arguments sont passés et traités sur différentes architectures ou compilateurs. Les développeurs doivent être conscients de ces différences, surtout lorsqu'ils écrivent des bibliothèques ou des applications qui doivent être portables sur plusieurs plateformes.
- Alternatives modernes : Dans les versions modernes de C++ (C++11 et ultérieures), il existe des alternatives plus sûres et plus flexibles pour gérer des nombres variables de paramètres, comme les gabarits et les initializers lists.
- L'utilisation de std::initializer_list ou de modèles de fonction peut souvent remplacer l'utilisation de va_arg, offrant une meilleure sécurité de type et une meilleure lisibilité du code.
Voir également
Langage de programmation - C++ - Référence procédures et fonctions - vprintf
Langage de programmation - C++ - Référence procédures et fonctions - vsprintf
Langage de programmation - C - Référence procédures et fonctions - va_arg
Références
Langage C, Edition Micro-Application, Gehard Willms, 2001, ISBN: 2-7429-2008-0, page 735.
Borland C++ for Windows 4.0, Library Reference, Edition Borland, 1993, Part # BCP1240WW21772, page 289.
Dernière mise à jour : Lundi, le 3 août 2015