如何正确包装具有动态参数数量的函数?
how do I correctly wrap a function with dynamic number of args up?
我想包装一个看起来像这样的函数: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__)
但事实证明我的论点搞砸了。我想知道这是为什么?
函数 dbgLog 必须采用 va_list 类型的参数,而不是通过省略号的可变参数:
void dbgLog(tDbgLog*dbg, const char *mod, const char *func, const char *format, va_list list)
^^^^^^^
函数 dbgLog 中的参数列表随后被传递给函数 vsnprintf。
没有可移植的方式将可变参数函数的参数传递给另一个可变参数函数。您可以通过调用定义为
的函数 vdbgLog
来实现 dbgLog
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);
}
您也可以直接从 pMonDbgLog
调用此函数 vdbgLog
:
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);
}
我想包装一个看起来像这样的函数: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__)
但事实证明我的论点搞砸了。我想知道这是为什么?
函数 dbgLog 必须采用 va_list 类型的参数,而不是通过省略号的可变参数:
void dbgLog(tDbgLog*dbg, const char *mod, const char *func, const char *format, va_list list)
^^^^^^^
函数 dbgLog 中的参数列表随后被传递给函数 vsnprintf。
没有可移植的方式将可变参数函数的参数传递给另一个可变参数函数。您可以通过调用定义为
的函数vdbgLog
来实现 dbgLog
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);
}
您也可以直接从 pMonDbgLog
调用此函数 vdbgLog
:
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);
}