Teilen über


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

Siehe auch

Makros (C/C++)