Namespaces
Variants

Variadic arguments

From cppreference.net

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