Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Le macro di Variadic sono macro del tipo di funzione che contengono un numero variabile di argomenti.
Note
Per utilizzare le macro variadic, ellissi possono essere specificati come argomento formale finale in una definizione di macro e l'identificatore di sostituzione __VA_ARGS__ può essere utilizzato nella definizione per inserire argomenti aggiuntivi.__VA_ARGS__ viene sostituito da eventuali argomenti corrispondenti agli ellissi, incluse le virgole tra loro.
Lo standard c specifica che almeno un argomento deve essere passato a puntini di sospensione, per garantire che la macro non risolverà a un'espressione con una virgola finale.L'implementazione di Visual C++ da una virgola finale se nessun argomento viene passato a puntini di sospensione.
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 C2059
}