用可变数量的参数包装宏

Wrap macro with variable number of arguments

我需要包装一个宏,以便可以使用函数访问它。 宏定义如下:

#define gDbgLog(fmt,...)  dbgLog(g_pdbg,MODULE_NAME,__FUNCTION__,fmt,##__VA_ARGS__)

并且我尝试将其总结为:

void pMonDbgLog(char* fmt, ...)
{
    va_list args;
    va_start(args,fmt);
    gDbgLog(fmt,args);
    va_end(args);
}

虽然 fmt 似乎顺利通过,但参数 (int) 似乎被破坏了。我这样称呼它:

int x = 51144;
pMonDbgLog("some text %d",x);

而我得到的是 "some text 642129608" 而像 DbgLog("some text %d",x); 那样直接调用宏工作正常。这是为什么?

dbgLog() 包装 vsnprintf() 以生成输出。

wrap macro with variable number of arguments

根本不可能 "expand" 一个 valist 到可变数量的参数并将它们传递给 运行 时间的可变参数函数,至少没有任何额外的助手(它们不是 C 的一部分,不可移植,可能对您不可用 implementation/platform)。

gDbgLog() 期望每个 参数分别:

gDbgLog("%s %d", "hello, world", 42);

您显示的代码所做的是将 one 参数作为 __VA_ARGS__ 部分传递,即 valist.[=22= 的值]

gDbgLog(fmt,args);

如何解决这个问题?

dbgLog() wraps vsnprintf() to generate the output.

所以只需删除 gDbgLog() 并从 pMonDbgLog() 调用 vsnprintf() 直接传递由您显示的代码片段初始化的 valist