Variadic arguments
Les fonctions variadiques sont des fonctions qui peuvent être appelées avec un nombre variable d'arguments.
Seules les déclarations de fonctions prototypées peuvent être variadiques. Ceci est indiqué par le paramètre de la forme ... qui doit apparaître en dernier dans la liste des paramètres et doit suivre au moins un paramètre nommé (jusqu'à C23) . Le paramètre ellipsis et le paramètre précédent doivent être délimités par , .
// Déclaration prototype int printx(const char* fmt, ...); // fonction déclarée de cette manière printx("hello world"); // peut être appelée avec un printx("a=%d b=%d", a, b); // ou plusieurs arguments int printz(...); // OK depuis C23 et en C++ // Erreur jusqu'à C23 : ... doit suivre au moins un paramètre nommé // int printy(..., const char* fmt); // Erreur : ... doit être le dernier // int printa(const char* fmt...); // Erreur en C : ',' est requis ; OK en C++
Lors de l' appel de fonction , chaque argument faisant partie de la liste d'arguments variables subit des conversions implicites spéciales appelées promotions d'arguments par défaut .
Dans le corps d'une fonction qui utilise des arguments variadiques, les valeurs de ces arguments peuvent être accédées en utilisant les
<stdarg.h>
facilités de la bibliothèque
:
|
Défini dans l'en-tête
<stdarg.h>
|
|
|
permet l'accès aux arguments des fonctions variadiques
(macro de fonction) |
|
|
accède au prochain argument de fonction variadique
(macro de fonction) |
|
|
(C99)
|
effectue une copie des arguments des fonctions variadiques
(macro de fonction) |
|
termine le parcours des arguments des fonctions variadiques
(macro de fonction) |
|
|
contient les informations nécessaires pour
va_start
,
va_arg
,
va_end
, et
va_copy
(typedef) |
|
Table des matières |
Notes
Bien que les anciennes déclarations (sans prototype)
de fonctions
permettent aux appels de fonction ultérieurs d'utiliser n'importe quel nombre d'arguments, elles ne peuvent pas être variadiques (depuis C89). La définition d'une telle fonction doit spécifier un nombre fixe de paramètres et ne peut pas utiliser les macros
stdarg.h
.
// déclaration de style ancien, supprimée dans C23 int printx(); // fonction déclarée de cette manière printx("hello world"); // peut être appelée avec un printx("a=%d b=%d", a, b); // ou plusieurs arguments // le comportement d'au moins un de ces appels est indéfini, selon // le nombre de paramètres que la fonction est définie pour prendre
Exemple
#include <stdio.h> #include <time.h> #include <stdarg.h> void tlog(const char* fmt,...) { char msg[50]; strftime(msg, sizeof msg, "%T", localtime(&(time_t){time(NULL)})); printf("[%s] ", msg); va_list args; va_start(args, fmt); vprintf(fmt, args); va_end(args); } int main(void) { tlog("logging %d %d %d...\n", 1, 2, 3); }
Sortie :
[10:21:38] logging 1 2 3...
Références
- Norme C17 (ISO/CEI 9899:2018) :
-
- 6.7.6.3/9 Déclarateurs de fonction (incluant les prototypes) (p: 96)
-
- 7.16 Arguments variables <stdarg.h> (p: 197-199)
- Norme C11 (ISO/IEC 9899:2011) :
-
- 6.7.6.3/9 Déclarateurs de fonction (incluant les prototypes) (p: 133)
-
- 7.16 Arguments variables <stdarg.h> (p: 269-272)
- Norme C99 (ISO/CEI 9899:1999) :
-
- 6.7.5.3/9 Déclarateurs de fonction (y compris les prototypes) (p: 119)
-
- 7.15 Arguments variables <stdarg.h> (p: 249-252)
- Norme C89/C90 (ISO/CEI 9899:1990) :
-
- 3.5.4.3/5 Déclarateurs de fonction (incluant les prototypes)
-
- 4.8 ARGUMENTS VARIABLES <stdarg.h>
Voir aussi
|
Documentation C++
pour
Variadic arguments
|