Macros Variadic
Les macros variadic sont des macros similaires à des fonctions 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 de remplacement __VA_ARGS__ peut être utilisé dans la définition afin d'insérer des arguments supplémentaires. __VA_ARGS__ est remplacé par tous les arguments qui correspondent aux points de suspension, notamment les 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 se résout pas à une expression avec une virgule de fin. L'implémentation 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 error C2059, except VC++
// suppresses the trailing comma
}
Sortie
here are some varargs1(1)
here are some varargs2(4)
here are some varargs3(5)
hello, world
error