va_arg
|
Défini dans l'en-tête
<cstdarg>
|
||
|
T va_arg
(
std
::
va_list
ap, T
)
;
|
||
La macro
va_arg
s'étend en une expression de type
T
qui correspond au paramètre suivant du
va_list
ap
.
Avant d'appeler
va_arg
,
ap
doit être initialisé par un appel à
va_start
ou
va_copy
, sans appel intermédiaire à
va_end
. Chaque invocation de la macro
va_arg
modifie
ap
pour pointer vers l'argument variable suivant.
Si le type du prochain argument 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 void et l'autre est un pointeur vers un type caractère ( char , signed char , ou unsigned char ).
Si
va_arg
est appelé lorsqu'il n'y a plus d'arguments dans
ap
, le comportement est indéfini.
Table des matières |
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
#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
|
|