Partager via


Macros variadiques

Les macros variadiciques sont des macros de type fonction qui contiennent un nombre variable d’arguments.

Notes

Pour utiliser des macros variadiques, les points de suspension peuvent être spécifiés comme argument formel final dans une définition de macro, et l’identificateur __VA_ARGS__ de remplacement peut être utilisé dans la définition pour insérer les arguments supplémentaires. __VA_ARGS__ est remplacé par tous les arguments qui correspondent aux points de suspension, y compris les virgules entre elles.

La norme C spécifie qu’au moins un argument doit être passé aux points de suspension pour s’assurer que la macro ne se résout pas en expression avec une virgule de fin. L’implémentation Traditionnelle de Microsoft C++ supprime une virgule de fin si aucun argument n’est passé aux points de suspension. Lorsque l’option du /Zc:preprocessor compilateur est définie, la virgule de fin n’est pas supprimée.

Exemple

// 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

Voir aussi

Macros (C/C++)