Como hacer una macro variadic (número variable de argumentos)
-
22-08-2019 - |
Pregunta
Quiero escribir una macro en C que acepta cualquier número de parámetros, no un número específico
ejemplo:
#define macro( X ) something_complicated( whatever( X ) )
donde X
es cualquier número de parámetros
Necesito esto porque whatever
está sobrecargado y se puede llamar con 2 o 4 parámetros.
He intentado definir la macro dos veces, pero la segunda definición sobreescribí el primero!
El compilador estoy trabajando con es g ++ (más específicamente, MinGW)
Solución
manera C99, apoyada también por compilador C ++.
#define FOO(fmt, ...) printf(fmt, ##__VA_ARGS__)
Otros consejos
__VA_ARGS__
es la forma estándar de hacerlo. No usar hacks específicas del compilador si no tiene que hacerlo.
Estoy muy molesto que no puedo comentar sobre el post original. En cualquier caso, C ++ no es un superconjunto de C. Es realmente tonto para compilar el código C con un compilador de C ++. No haga lo que Donny Do not hace.
No creo que eso sea posible, usted podría fingir con parens dobles ... con tal de que no necesita los argumentos de forma individual.
#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 entiende macros variadic, también se puede despojar de impresión con uno de los siguientes:
#define PRINT //
o
#define PRINT if(0)print
Los primeros comentarios a cabo las instrucciones de impresión, el segundo impide instrucción de impresión debido a una condición NULL si. Si se establece la optimización, el compilador debe despojar a cabo las instrucciones no ejecutadas como: if (0) print ( "Hola mundo"); o ((void) 0);
explicada por g ++ aquí, aunque es parte de C99 así debería funcionar para todo el mundo
http://www.delorie.com/gnu/docs/gcc /gcc_44.html
ejemplo rápido:
#define debug(format, args...) fprintf (stderr, format, args)