将可变参数传递给另一个接受可变参数列表的函数

新手上路,请多包涵

所以我有两个函数都有相似的参数

void example(int a, int b, ...);
void exampleB(int b, ...);

现在 example 调用 exampleB ,但是如何在不修改的情况下传递变量参数列表中的变量 exampleB (因为这也已在其他地方使用)。

原文由 Not Available 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.6k
2 个回答

你不能直接这样做;您必须创建一个采用 va_list 的函数:

 #include <stdarg.h>

static void exampleV(int b, va_list args);

void exampleA(int a, int b, ...)    // Renamed for consistency
{
    va_list args;
    do_something(a);                // Use argument a somehow
    va_start(args, b);
    exampleV(b, args);
    va_end(args);
}

void exampleB(int b, ...)
{
    va_list args;
    va_start(args, b);
    exampleV(b, args);
    va_end(args);
}

static void exampleV(int b, va_list args)
{
    ...whatever you planned to have exampleB do...
    ...except it calls neither va_start nor va_end...
}

原文由 Jonathan Leffler 发布,翻译遵循 CC BY-SA 4.0 许可协议

它可能与此处描述的情况不完全相同,但如果您要为字符串格式函数(例如记录器)定义包装器:

 void logger(const char *name, const char *format, ...);
void wrapper(const char *format, ...);

当您实现 wrapper 调用 logger 时,我们可以先使用 vasprintf 创建一个字符串,然后将其传递给 logger

 #include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>

static void wrapper(const char *format, ...)
{
    char *string;
    va_list args;
    va_start(args, format);

    // variadic printf with allocated string. must free()
    vasprintf(&string, format, args);
    logger("wrapper", "%s", string);

    free(string);
    va_end(args);
}

不是最干净的,但有效。当您必须避免使用 函数时,请尝试此操作。

原文由 Jake Fetiu Kim 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题