Freigeben über


Variadic-Makros

Variadic-Makros sind funktionsähnliche Makros, die eine variable Anzahl von Argumenten enthalten.

Hinweise

Um variadic-Makros zu verwenden, können die Auslassungszeichen als endgültiges formales Argument in einer Makrodefinition angegeben werden, und mit dem Ersetzungsbezeichner __VA_ARGS__ können Sie in der Definition die zusätzlichen Argumente einfügen. __VA_ARGS__ wird von allen Argumenten, die mit den Auslassungszeichen übereinstimmen, einschließlich Kommas zwischen ihnen, ersetzt.

Der C-Standard gibt an, dass mindestens ein Argument an die Auslassungszeichen übergeben werden muss, um sicherzustellen, dass das Makro sich nicht in einen Ausdruck mit einem nachfolgenden Komma auflöst. Die Implementierung von Visual C++ unterdrückt ein nachfolgendes Komma, wenn keine Argumente an die Auslassungszeichen übergeben werden.

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
}

Output

here are some varargs1(1)
here are some varargs2(4)
here are some varargs3(5)
hello, world
error

Siehe auch

Referenz

Makros (C/C++)