我需要包装一个宏,以便可以使用函数访问它。 宏的定义如下:
#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);
我得到的是"一些文字642129608" ,而像DbgLog("some text %d",x);
一样直接调用宏工作正常。这是为什么?
dbgLog()
包裹vsnprintf()
以生成输出。
答案 0 :(得分:0)
用可变数量的参数包装宏
根本无法扩展&#34; a <modules>
到可变数量的参数并在运行时将它们传递给可变参数函数,至少不与任何其他帮助程序(它们不是C的一部分,并且不可移植,可能不适用于您的实现) /平台)。
valist
期望每个参数单独传递 :
gDbgLog()
您展示的代码所代替的是将一个参数作为gDbgLog("%s %d", "hello, world", 42);
部分传递,即__VA_ARGS__
的值。
valist
如何解决这个问题?
dbgLog()包装vsnprintf()以生成输出。
所以,只需退出gDbgLog(fmt,args);
并从gDbgLog()
致电vsnprintf()
,直接通过您显示的代码段初始化的pMonDbgLog()
。