【问题标题】:Wrap macro with variable number of arguments使用可变数量的参数包装宏
【发布时间】:2016-08-12 21:14:50
【问题描述】:

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

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

【问题讨论】:

  • 对于您的示例用法,您可以直接调用宏,即gDbgLog("some text %d",x);。为什么你认为你需要一个函数包装器?

标签: c arguments variadic-functions variadic-macros


【解决方案1】:

用可变数量的参数包装宏

根本不可能将valist“扩展”为可变数量的参数,并在运行时将这些参数传递给可变参数函数,至少不能使用任何额外的帮助器(它们不是 C 的一部分并且是不可移植,可能不适用于您的实现/平台)。

gDbgLog() 期望 每个 参数单独传递:

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

您显示的代码所做的只是将 one 参数作为__VA_ARGS__ 部分传递,即valist 的值。

gDbgLog(fmt,args);

如何解决?

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    • 2014-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多