2016-08-17 10 views
-1

Я хочу, чтобы обернуть функцию, которая выглядит следующим образом: void dbgLog (tDbgLog *dbg, const char *mod, const char *func, const char *format,...) и делает использование vsnprintf(), чтобы сделать его доступным, вызывая другую функцию, я попытался следующие, но это, кажется, не работать правильно:Как правильно перенести функцию с динамическим числом аргументов вверх?

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); 
} 

и я снова делаю это доступным через следующий макрос: #define gDbgLog(fmt,...) pMonDbgLog(MODULE_NAME,__FUNCTION__,fmt, ##__VA_ARGS__), но оказывается, что мои аргументы перепутаны. Почему это, мне интересно?

ответ

0

Нет переносного способа передать аргументы функции vararg другой функции vararg. Вы можете реализовать dbgLog путем вызова функции vdbgLog определяется как:

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); 
} 

И вы можете вызвать эту функцию vdbgLog непосредственно из 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); 
} 
3

Функция dbgLog должна принимать аргумент типа va_list, а не переменными аргументами через многоточие:

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

список аргументов в функции dbgLog, затем передается функционировать vsnprintf.