macro define __va_args__ c g++ c-preprocessor variadic

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))



__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);