2008-09-15 18 views

Respuesta

24

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.

-2

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.

+0

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' –

4

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.

+0

VC++ come la coma final si no hay argumentos, ¿no? –

0

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

Buscar "VA_ARGS" y va_list en MSDN!

4

Si no desea utilizar extensiones no estándar, usted tiene que proporcionar soportes adicionales:

#define DBGPRINT(args) printf(args); 
DBGPRINT(("%s\n", "Hello World")); 
+4

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'. –

+0

#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

1

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.

1

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

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