Macros variadiques
Les macros variadiciques sont des macros de type fonction qui contiennent un nombre variable d’arguments.
Notes
Pour utiliser des macros variadiques, 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 les arguments supplémentaires. __VA_ARGS__
est remplacé par tous les arguments qui correspondent aux points de suspension, y compris les virgules entre elles.
La norme C spécifie qu’au moins un argument doit être passé aux points de suspension pour s’assurer que la macro ne se résout pas en expression avec une virgule de fin. L’implémentation Traditionnelle de Microsoft C++ supprime une virgule de fin si aucun argument n’est passé aux points de suspension. Lorsque l’option du /Zc:preprocessor
compilateur est définie, la virgule de fin n’est pas supprimée.
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
}
here are some varargs1(1)
here are some varargs2(4)
here are some varargs3(5)
hello, world
error