用可变数量的参数包装宏
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
。
我需要包装一个宏,以便可以使用函数访问它。 宏定义如下:
#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
。