Macros de Variadic
Les macros de Variadic sont des macros comme une fonction qui contiennent un nombre variable d'arguments.
Notes
Pour utiliser des macros variadic, les points de suspension peuvent être spécifiés comme argument formel final dans une définition de macro, et l'identificateur __VA_ARGS__ de remplacement peut être utilisé dans la définition pour insérer des arguments supplémentaires.__VA_ARGS__ est remplacé par tous les arguments qui correspondent à des points de suspension, y compris des virgules entre elles.
La norme C spécifie qu'au moins un argument doit être passé aux points de suspension, pour garantir que la macro ne résout pas à une expression avec une virgule de fin.L'implémentation de Visual C++ supprime une virgule de fin si aucun argument n'est passé aux points de suspension.
Exemple
// variadic_macros.cpp
#include <stdio.h>
#define EMPTY
#define CHECK1(x, ...) if (!(x)) { printf(__VA_ARGS__); }
#define CHECK2(x, ...) if ((x)) { printf(__VA_ARGS__); }
#define CHECK3(...) { printf(__VA_ARGS__); }
#define MACRO(s, ...) printf(s, __VA_ARGS__)
int main() {
CHECK1(0, "here %s %s %s", "are", "some", "varargs1(1)\n");
CHECK1(1, "here %s %s %s", "are", "some", "varargs1(2)\n"); // won't print
CHECK2(0, "here %s %s %s", "are", "some", "varargs2(3)\n"); // won't print
CHECK2(1, "here %s %s %s", "are", "some", "varargs2(4)\n");
// always invokes printf in the macro
CHECK3("here %s %s %s", "are", "some", "varargs3(5)\n");
MACRO("hello, world\n");
// MACRO("error\n", EMPTY); would cause C2059
}