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)

¿Fue útil?

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)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top