define - Cómo hacer una macro variadica(número variable de argumentos)
define c macro (5)
C99 way, también compatible con el compilador de VC ++.
#define FOO(fmt, ...) printf(fmt, ##__VA_ARGS__)
Quiero escribir una macro en C que acepte cualquier cantidad de parámetros, no un número específico
ejemplo:
#define macro( X ) something_complicated( whatever( X ) )
donde X
es cualquier cantidad de parámetros
Lo necesito porque whatever
está sobrecargado y puede llamarse con 2 o 4 parámetros.
Traté de definir el 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)
No creo que eso sea posible, podrías fingir con doble parens ... siempre y cuando no necesites los argumentos individualmente.
#define macro(ARGS) some_complicated (whatever ARGS)
// ...
macro((a,b,c))
macro((d,e))
explicado para g ++ aquí, aunque es parte de C99, así 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)
__VA_ARGS__
es la forma estándar de hacerlo. No use hacks específicos del compilador si no es necesario.
Estoy realmente molesto porque no puedo comentar sobre la publicación original. En cualquier caso, C ++ no es un superconjunto de C. Es realmente tonto compilar su código C con un compilador de C ++. No hagas lo que Donny Do no hace.
#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 macros variadic, también puede quitar 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 debe quitar las instrucciones nunca ejecutadas como: if (0) print ("hello world"); o ((nulo) 0);