Cómo hacer una macro variada (número variable de argumentos)
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 X
está cualquier número de parámetros?
Necesito esto porque whatever
está 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)
Manera C99:
#define FOO(...) printf(__VA_ARGS__)
__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++.
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))
#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);
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)