将省略号传递给另一个可变参数函数

时间:2009-03-30 04:10:14

标签: c variadic-functions

我有大约30个可变函数。每个人都接受一个路径作为最终参数,例如:

bool do_foo(struct *f, int q, const char *fmt, ...)

在每个函数中,我必须检查扩展格式是否小于或等于特定大小。所以,我发现自己复制/粘贴相同的代码块来检查有多少个字符vsnprintf()没有打印,相应地设置errno并保释出写入。

我想要做的是编写一个函数来执行此操作,它将返回一个已知为安全大小的静态分配(扩展)字符串,或者在失败时重新初始化的字符串,可以针对NULL进行检查。检查还必须确定字符串是绝对路径还是相对路径,这会影响字符串的安全大小。这是很多重复的代码,它开始闻起来。

有没有办法可以将elipsis的内容从我的函数的条目传递给另一个函数?或者我是否必须先调用va_start(),然后将va_list传递给辅助函数?

修改

我完全不反对将va_list传递给助手,我只是想确保没有别的东西存在。在我看来,编译器了解可变参数的开始位置,所以我只是好奇我是否可以告诉它传递它们。

4 个答案:

答案 0 :(得分:68)

您不能,您只能将参数作为va_list传递。请参阅comp.lang.c FAQ

通常,如果你在C中编写可变参数函数(即带有可变数量参数的函数),你应该为每个函数编写两个版本:一个带省略号(...)和一个va_list。采用省略号的版本应调用va_start,调用版本va_list,调用va_end,然后返回。两个版本的函数之间不需要代码重复,因为一个调用另一个版本。

答案 1 :(得分:10)

可能你可以使用可变参数宏 - 像这样:

#define FOO(...)  do { do_some_checks; myfun(__VA_ARGS__); } while (0)

NB! Variadic宏只有C99

答案 2 :(得分:1)

我不知道这是否有帮助,您可以通过引用访问变量。这是一种偷偷摸摸的技巧,但遗憾的是它不允许你在最终的函数定义中使用省略号。

#include <stdio.h>

void print_vars(int *n)
{
  int i;
  for(i=0;i<=*n;i++)
    printf("%X %d  ", (int)(n+i), *(n+i));
  printf("\n");
}

void pass_vars(int n, ...)
{
  print_vars(&n);
}

int main()
{
    pass_vars(4, 6, 7, 8, 0);
    return 0;
}

在我的电脑上输出

$ ./a.out
BFFEB0B0 4  BFFEB0B4 6  BFFEB0B8 7  BFFEB0BC 8  BFFEB0C0 0

答案 3 :(得分:0)

您必须将va_list传递给帮助者。