Compartir a través de


Macros variádicas

Las macros variádicas son macros estilo funciones que contienen un número variable de argumentos.

Comentarios

Para usar macros variádicas, los puntos suspensivos se pueden especificar como argumento formal final de una definición de macro, y el identificador de reemplazo __VA_ARGS__ se puede emplear en la definición para insertar los argumentos adicionales. __VA_ARGS__ se reemplaza por todos los argumentos que coinciden con los puntos suspensivos, incluidas las comas entre ellos.

El estándar C especifica que se debe pasar al menos un argumento a los puntos suspensivos para garantizar que la macro no se resuelva en una expresión con una coma final. La implementación de Microsoft C++ tradicional suprime una coma final si no se pasa ningún argumento a los puntos suspensivos. Cuando se establece la opción del compilador /Zc:preprocessor, la coma final no se suprime.

Ejemplo

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

Vea también

Macros (C/C++)