Por lo que yo sé, en gcc puede escribir algo como:¿hay alguna manera de escribir macros con una lista de argumentos variables en C++ visual?
#define DBGPRINT(fmt...) printf(fmt);
¿Hay una manera de hacerlo en VC++?
Por lo que yo sé, en gcc puede escribir algo como:¿hay alguna manera de escribir macros con una lista de argumentos variables en C++ visual?
#define DBGPRINT(fmt...) printf(fmt);
¿Hay una manera de hacerlo en VC++?
Sí, pero sólo desde VC++ 2005. La sintaxis para su ejemplo sería:
#define DBGPRINT(fmt, ...) printf(fmt, __VA_ARGS__)
Una referencia completa es here.
Casi. Es más feo que eso sin embargo (y es probable que no quieren un punto y coma detrás de la propia macro:
#define DBGPRINT(DBGPRINT_ARGS) printf DBGPRINT_ARGS // note: do not use '(' & ')'
utilizarlo:
DBGPRINT(("%s\n", "Hello World"));
(faltaba un par de parens).
no sé por qué todos los aspectos negativos, la pregunta original no declararon una versión de VC++ y macros variadic no son compatibles con todos los compiladores.
sí, se puede hacer esto en Visual Studio C++ en las versiones de 2005 y posteriores (no estoy seguro acerca de VS 2003). Eche un vistazo a VA_ARGS. Puede hacer básicamente algo como esto:
#define DBGPRINTF(fmt, ...) printf(fmt, __VA_ARGS__)
y los argumentos variables a la macro se van pasando a la función proporcionada como '...' args, donde se puede luego nos va_args para analizar a cabo.
No puede haber un comportamiento extraño con VA_ARGS y el uso de macros. Porque 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 de hacerlo.
VC++ come la coma final si no hay argumentos, ¿no? –
Lo que estamos buscando son llamados [macros variadic] (http://msdn.microsoft.com/en-us/library/ms177415(VS.80).aspx)
Resumen del enlace:.. Sí, a partir de VC++ 2005 en un máximo
El siguiente debe funcionar (Ver enlace a Variadic macros.)
(Ejemplo siguiente muestra una argumentos fijos y variables.)
# define DBGPRINTF(fmt,...) \
do { \
printf(fmt, __VA_ARGS__); \
} while(0)
Buscar "VA_ARGS" y va_list en MSDN!
Si no desea utilizar extensiones no estándar, usted tiene que proporcionar soportes adicionales:
#define DBGPRINT(args) printf(args);
DBGPRINT(("%s\n", "Hello World"));
Esto está muy mal, y aun así tiene upvotes ... Yo despediría a alguien por el punto y coma al final de la definición solo. Lo que pretendía: '#define DBGPRINT (args) printf args' ... pero en este caso, bastará' #define DBGPRINT printf'. –
#define DBGPRINT printf no funcionará si desea eludir todo el código de salida de depuración del archivo ejecutable. Te quedarán todas las listas de parámetros (...) y al menos activará las advertencias, puede causar errores y efectos secundarios inesperados. – Tomek
Si en realidad no necesita ninguna de las características de las macros (__FILE__
, __LINE__
, símbolo -pasting, etc.) es posible que desee considerar escribir una función variadic utilizando stdargs.h
. En lugar de llamar al printf()
, una función variadic puede llamar al vprintf()
para pasar listas de argumentos variables.
Para MSVC 7.1 (.NET 2003), esto funciona:
#if defined(DETAILED_DEBUG)
#define DBGPRINT fprintf
#else
__forceinline void __DBGPRINT(...){}
#define DBGPRINT __DBGPRINT
#endif
persumably los downvotes eran porque los parens faltan significaba que estaba roto ... aunque notablemente, una versión aún más equivocado de esta por encima consiguió 5 upvotes. Todos ustedes se perdieron el simple '#define DBGPRINT printf' –