Cómo hacer una macro variada (número variable de argumentos)

Resuelto hasen asked hace 15 años • 6 respuestas

Quiero escribir una macro en C que acepte cualquier número de parámetros, no un número específico

ejemplo:

#define macro( X )  something_complicated( whatever( X ) )

¿Dónde Xestá cualquier número de parámetros?

Necesito esto porque whateverestá sobrecargado y se puede llamar con 2 o 4 parámetros.

Intenté definir la macro dos veces, ¡pero la segunda definición sobrescribió la primera!

El compilador con el que estoy trabajando es g++ (más específicamente, mingw)

hasen avatar Mar 25 '09 09:03 hasen
Aceptado

Manera C99:

#define FOO(...) printf(__VA_ARGS__)
Alex B avatar Mar 25 '2009 02:03 Alex B

__VA_ARGS__es la forma estándar de hacerlo. No utilice trucos específicos del compilador si no es necesario.

C++ no es un superconjunto de C. Es realmente una tontería compilar su código C con un compilador de C++.

cmccabe avatar Sep 04 '2011 21:09 cmccabe

No creo que eso sea posible, puedes simularlo con pares dobles... siempre y cuando no necesites los argumentos individualmente.

#define macro(ARGS) some_complicated (whatever ARGS)
// ...
macro((a, b, c))
macro((d, e))
eduffy avatar Mar 25 '2009 02:03 eduffy
#define DEBUG

#ifdef DEBUG
  #define PRINT print
#else
  #define PRINT(...) ((void)0) //strip out PRINT instructions from code
#endif 

void print(const char *fmt, ...) {

    va_list args;
    va_start(args, fmt);
    vsprintf(str, fmt, args);
        va_end(args);

        printf("%s\n", str);

}

int main() {
   PRINT("[%s %d, %d] Hello World", "March", 26, 2009);
   return 0;
}

Si el compilador no comprende las macros variadas, también puede eliminar PRINT con cualquiera de los siguientes:

#define PRINT //

o

#define PRINT if(0)print

El primero comenta las instrucciones PRINT, el segundo evita la instrucción PRINT debido a una condición NULL if. Si se establece la optimización, el compilador debería eliminar instrucciones nunca ejecutadas como: if(0) print("hello world"); o ((nulo)0);

 avatar Mar 26 '2009 20:03

explicado para g++ aquí, aunque es parte de C99, por lo que debería funcionar para todos

http://www.delorie.com/gnu/docs/gcc/gcc_44.html

ejemplo rápido:

#define debug(format, args...) fprintf (stderr, format, args)
DarenW avatar Mar 25 '2009 02:03 DarenW