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 que está buscando se llama [macros variadas] ( http://msdn.microsoft.com/en-us/library/ms177415(VS.80).aspx) .
Resumen del enlace: sí, de VC ++ 2005 en adelante.
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