VA_END |
Fin d'argument |
---|---|
Langage C++ | cstdarg (stdarg.h) |
Syntaxe
void va_end(va_list ptrargument) |
Paramètres
Nom | Description |
---|---|
ptrargument | Ce paramètre permet d'indiquer le pointeur d'argument |
Description
Cette fonction permet de fixer le pointeur d'argument à la toute fin.
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 d'argument 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 rôle : La fonction va_end est utilisée dans le contexte de la gestion des arguments variables dans une fonction. Elle permet de terminer l'utilisation d'une liste de paramètres initialisée par va_start. Son rôle principal est de libérer les ressources associées à l'objet va_list ayant été utilisé pour accéder aux arguments, garantissant ainsi une bonne gestion de la mémoire.
- Importance de son utilisation : Il est crucial d'utiliser va_end après avoir fini d'utiliser va_arg pour éviter des fuites de mémoire et garantir que le comportement de la fonction reste défini. Négliger d'appeler va_end peut entraîner des comportements indéfinis dans le programme, car certaines implémentations peuvent allouer des ressources supplémentaires pour gérer la liste de paramètres.
- Placement dans le code : va_end doit être appelée avant la fin de la fonction qui a utilisé va_start. Cela garantit que toutes les ressources sont correctement libérées à un moment approprié. Typiquement, il est placé juste avant le retour de la fonction, après avoir terminé de traiter tous les paramètres.
- Portabilité et compatibilité : Bien que va_end soit standard dans le langage C et C++, il existe des différences potentielles dans son implémentation sur différentes plateformes et compilateurs. Les développeurs doivent être attentifs à l'utilisation de va_end, surtout lorsqu'ils écrivent du code qui doit fonctionner sur plusieurs systèmes, car des implémentations spécifiques peuvent avoir des exigences particulières.
- Interactions avec va_start : La macro va_end est souvent utilisée en conjonction avec va_start. En effet, chaque appel à va_start doit être suivi par un appel correspondant à va_end. Cela permet de maintenir un bon équilibre dans la gestion des ressources, garantissant que chaque fois que vous commencez à accéder à des arguments variables, vous terminez correctement cette opération.
- Absence d'effet secondaire : Contrairement à va_start, préparer la liste de paramètres pour l'accès, va_end n'a pas d'effet visible sur les valeurs des arguments. Elle ne modifie pas les données, mais agit en tant que mécanisme de nettoyage. Cette caractéristique permet aux développeurs de se concentrer sur la logique de traitement des arguments sans se soucier des modifications indésirables des données.
- Alternatives modernes : Dans les versions récentes de C++ (C++11 et ultérieures), l'utilisation de va_end peut être moins fréquente en raison des nouvelles fonctionnalités telles que les templates et les variadic templates, qui offrent une manière plus sécurisée et plus facile de gérer les paramètres variables. Ces alternatives permettent de contourner complètement la nécessité de va_end, rendant le code plus propre et moins susceptible aux erreurs liées à la gestion des paramètres.
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_end
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