Variadische Makros
Variadic-Makros sind funktionsähnliche Makros, die eine variable Anzahl von Argumenten enthalten.
Hinweise
Um variadische Makros zu verwenden, können die Auslassungspunkte als letztes formales Argument in einer Makrodefinition angegeben werden, und der Ersetzungsbezeichner __VA_ARGS__
kann in der Definition verwendet werden, um die zusätzlichen Argumente einzufügen. __VA_ARGS__
wird durch alle Argumente ersetzt, die den Auslassungszeichen entsprechen, einschließlich Kommas dazwischen.
Der C Standard gibt an, dass mindestens ein Argument an die Auslassungspunkte übergeben werden muss, um sicherzustellen, dass das Makro nicht in einen Ausdruck mit einem nachfolgenden Komma aufgelöst wird. Die herkömmliche Microsoft C++-Implementierung unterdrückt ein nachfolgendes Komma, wenn keine Argumente an die Auslassungspunkte übergeben werden. Wenn die /Zc:preprocessor
Compileroption festgelegt ist, wird das nachfolgende Komma nicht unterdrückt.
Beispiel
// 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