sintaxis parametros funciones ejemplos definicion con comandos codigos basicos basicas c++ visual-c++ c-preprocessor variadic-macros

parametros - ¿Hay alguna manera de escribir macros con una lista de argumentos variables en C++ visual?



funciones en c++ ejemplos (9)

¡Busque " VA_ARGS " y va_list en MSDN!

Por lo que sé, en gcc puedes escribir algo como:

#define DBGPRINT(fmt...) printf(fmt);

¿Hay alguna manera de hacerlo en VC ++?



Lo siguiente debería funcionar (Ver enlace a macros Variadic )

(El siguiente ejemplo muestra un argumento fijo y variable).

# define DBGPRINTF(fmt,...) / do { / printf(fmt, __VA_ARGS__); / } while(0)


Sí, pero solo desde VC ++ 2005. La sintaxis para su ejemplo sería:

#define DBGPRINT(fmt, ...) printf(fmt, __VA_ARGS__)

Una referencia completa está aquí .


Sí, puede hacerlo en Visual Studio C ++ en las versiones de 2005 y posteriores (no estoy seguro acerca de VS 2003). Eche un vistazo a VA_ARGS . Básicamente puedes hacer algo como esto:

#define DBGPRINTF(fmt, ...) printf(fmt, __VA_ARGS__)

y los argumentos variables a la macro se pasarán a la función provista como ''...'' args, donde luego puede usarnos va_args para analizarlos.

Puede haber un comportamiento extraño con VA_ARGS y el uso de macros. Como VA_ARGS es variable, eso significa que puede haber 0 argumentos. Eso podría dejarte con comas finales donde no tenías la intención.


Si no desea utilizar extensiones no estándar, debe proporcionar paréntesis adicionales:

#define DBGPRINT(args) printf(args); DBGPRINT(("%s/n", "Hello World"));


Si no necesita ninguna de las características de las macros ( __FILE__ , __LINE__ , token-pasting, etc.), puede considerar escribir una función stdargs.h usando stdargs.h . En lugar de llamar a printf() , una función variadica puede llamar a vprintf() para pasar listas de argumentos variables.


Casi. Sin embargo, es más feo que eso (y probablemente no quieras un punto y coma en la macro misma:

#define DBGPRINT(DBGPRINT_ARGS) printf DBGPRINT_ARGS // note: do not use ''('' & '')''

Para usarlo:

DBGPRINT(("%s/n", "Hello World"));

(faltaba un par de pareados).

No estoy seguro de por qué todos los negativos, la pregunta original no indicó una versión de VC ++, y las macros variadas no son compatibles con todos los compiladores.


Para MSVC 7.1 (.NET 2003), esto funciona:

#if defined(DETAILED_DEBUG) #define DBGPRINT fprintf #else __forceinline void __DBGPRINT(...){} #define DBGPRINT __DBGPRINT #endif