Quiero ajustar una función que se parece a: void dbgLog (tDbgLog *dbg, const char *mod, const char *func, const char *format,...) y hace uso de vsnprintf() para hacerla accesible llamando a otra función, he intentado lo siguiente pero no parece funcionar correctamente:

void pMonDbgLog(const char *mod, const char *func, char* fmt, ...)
{
    va_list args;
    va_start(args,fmt);
    dbgLog(g_pdbg,mod,func,fmt,args);
    va_end(args);
}

Y de nuevo lo hago accesible a través de la siguiente macro: #define gDbgLog(fmt,...) pMonDbgLog(MODULE_NAME,__FUNCTION__,fmt, ##__VA_ARGS__) pero resulta que mis argumentos se estropean. ¿Por qué es esto, me pregunto?

-1
stdcerr 17 ago. 2016 a las 21:14

2 respuestas

La mejor respuesta

No existe una forma portátil de pasar los argumentos de una función vararg a otra función vararg. Puede implementar dbgLog llamando a una función vdbgLog definida como:

void vdbgLog(tDbgLog *dbg, const char *mod, const char *func,
             const char *format, va_list ap) {
    /* your implementation goes here */
}

void dbgLog(tDbgLog *dbg, const char *mod, const char *func, const char *fmt, ...) {
    va_list args;
    va_start(args, fmt);
    vdbgLog(dbg, mod, func, fmt, args);
    va_end(args);
}

Y también puede llamar a esta función vdbgLog directamente desde pMonDbgLog:

void pMonDbgLog(const char *mod, const char *func, char *fmt, ...) {
    va_list args;
    va_start(args, fmt);
    vdbgLog(g_pdbg, mod, func, fmt, args);
    va_end(args);
}
0
chqrlie 17 ago. 2016 a las 18:24

La función dbgLog debe tomar un argumento de tipo va_list y no argumentos variables a través de la elipsis:

void dbgLog(tDbgLog*dbg, const char *mod, const char *func, const char *format, va_list list)
                                                                                ^^^^^^^

La lista de argumentos, en la función dbgLog, se pasa luego a la función vsnprintf.

3
2501 17 ago. 2016 a las 18:24