Macro variadic
Le macro variadiche sono delle macro tipo funzioni che contengono un numero variabile di argomenti.
Note
Per usare le macro variadiche, le ellissi devo essere specificate come argomento formale finale nella definizione della macro, e l'identificatore __VA_ARGS__ può essere usato nella definizione per inserire degli argomenti aggiuntivi. __VA_ARGS__ viene sostituito da tutti gli argomenti che combaciano con le ellissi, incluse le virgole tra di loro.
Lo standard C specifica che almeno un argomento deve essere passato all'ellisse, per garantire che la macro non risolva un espressione con un virgola finale. L'implementazione Visual C++ tronca una virgola finale se nessun argomento è stato passato all'ellisse.
Esempio
// 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
}
Output
here are some varargs1(1)
here are some varargs2(4)
here are some varargs3(5)
hello, world
error