用可变数量的参数包装宏

时间:2016-08-12 21:14:51

标签: c arguments variadic-functions variadic-macros

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

#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()以生成输出。

1 个答案:

答案 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()

相关问题