我想包装一个看起来像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 :(得分: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);
}