如何使用未知类型包装可变参数函数?

3

我有一个库中的函数,它接受一个消息和变参参数,并像printf一样打印它们。例如:

printMe(const char *fmt,...);

我正在尝试包装这个函数。我不知道参数类型和数量是什么。 我尝试像这样做:

printMeWrapper(const char *message,...)
{
    va_list argptr;
    va_start(argptr, message);
    printMe( message,argptr);
    va_end(argptr);
}

但是这只打印第一个参数。有什么办法可以正确地做到这一点吗?

据我所知,你不能以可移植的方式做到这一点(这就是为什么存在 v*printf 相关函数)。 - Anton Kovalenko
你能使用可变参数模板吗?如果可以,那么你可以将包装器实现为函数模板,然后轻松提取参数。这个原则在Andrei Alexandrescu的演讲中很好地展示了出来,你可以在这里看到幻灯片,重要部分从第17页开始。 - Fiktik
2个回答

3
你需要创建一个第二个printMe函数,它接受一个va_list参数,就像printfvprintf一样:
void printMeVa(const char *fmt, va_list va)
{
    ...
}

我需要使用printMe函数,但不知道它是如何实现的。 - talon
@talon 如果是这样,不幸的是,无法在普通的C(或C ++)中完成。 - Some programmer dude

1
您可以使用宏代替:

#define printMeWrapper(message, ...) \
  DoSmthBefore(); \
  printMe(message, __VA_ARGS__); \
  DoSmthAfter();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接