如何正确包装动态数量为args的函数?

时间:2016-08-17 18:14:06

标签: c dynamic arguments wrapper vxworks

我想包装一个看起来像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__)但事实证明我的论点搞砸了。为什么这样,我在想?

2 个答案:

答案 0 :(得分:3)

函数dbgLog必须通过省略号获取类型为va_list的参数而不是变量参数:

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

然后将函数dbgLog中的参数列表传递给函数vsnprintf。

答案 1 :(得分: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);
}