va_arg
De fr.cppreference.net
| Défini dans l'en-tête <cstdarg>
|
||
T va_arg( std::va_list ap, T );
|
||
La macro va_arg se développe en une expression de type T qui correspond au paramètre suivant de la va_list ap.
Avant d'appeler va_arg, ap doit être initialisé par un appel à soit va_start ou va_copy, sans appel intermédiaire à va_end. Chaque invocation de la macro va_arg modifie ap pour qu'il pointe vers l'argument variable suivant.
Si le type de l'argument suivant dans ap (après promotions) n'est pas compatible avec T, le comportement est indéfini, sauf si :
- un type est un type entier signé, l'autre type est le type entier non signé correspondant, et la valeur est représentable dans les deux types ; ou
- un type est un pointeur vers
voidet l'autre est un pointeur vers un type caractère (char,signed char, ouunsigned char).
Si va_arg est appelé alors qu'il n'y a plus d'arguments dans ap, le comportement est indéfini.
Paramètres
| ap | - | une instance du type va_list |
| T | - | le type du paramètre suivant dans ap |
Valeur développée
Le paramètre variable suivant dans ap .
Exemple
Exécuter ce code
#include <cstdarg> #include <cstdio> #include <iostream> void print_variance(std::size_t count, const char* fmt, ...) { double sum = 0; double sum_sq = 0; std::va_list args; va_start(args, fmt); for (std::size_t i = count; i--;) { double num = va_arg(args, double); sum += num; sum_sq += num* num; } va_end(args); std::printf(fmt, sum_sq / count - (sum / count) * (sum / count)); } void nano_printf(const char* fmt, ...) { std::va_list args; va_start(args, fmt); for (const char* p = fmt; *p != '\0'; ++p) { switch (*p) { case '%': switch (*++p) // lire le symbole de format { case 'i': std::cout << va_arg(args, int); continue; case 'f': std::cout << va_arg(args, double); continue; case 's': std::cout << va_arg(args, const char*); continue; case 'c': std::cout << static_cast<char>(va_arg(args, int)); continue; case '%': std::cout << '%'; continue; /* ...plus de cas... */ } break; // erreur de format... case '\n': std::cout << '\n'; continue; case '\t': std::cout << '\t'; continue; /* ...plus de cas... */ } std::cout << *p; } va_end(args); } int main() { print_variance(4, "%f\n", 25.0, 27.3, 26.9, 25.7); nano_printf("Args: %i%% %c%f %s\n", 42, '#', 3.14, "C++"); }
Sortie :
0.846875 Args: 42% #3.14 C++
Voir aussi
|
permet d'accéder aux arguments des fonctions variadiques
(macro de fonction) |
|
|
(C++11)
|
effectue une copie des arguments des fonctions variadiques
(macro de fonction) |
|
termine le parcours des arguments des fonctions variadiques
(macro de fonction) |
|
|
Documentation C
pour
va_arg
|
|