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

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

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

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

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

有没有一种方法可以将省略号的内容从函数的入口传递到另一个函数?还是必须先调用 va_start(),然后将 va_list传递给 helper 函数?

编辑:

我一点也不反对将 va_list传递给助手,我只是想确保没有其他东西存在。在我看来,编译器似乎知道变量参数从哪里开始,所以我只是好奇,如果我能告诉它传递它们。

38920 次浏览

必须将 va _ list 传递给 helper。

不能,只能将参数作为 va_list传递,请参见 常见问题解答

一般来说,如果你在 C 语言中编写可变函数(也就是说,使用可变参数数目的函数) ,你应该为每个函数编写两个版本: 一个采用省略号(...) ,另一个采用 va_list。采用省略号的版本应该调用 va_start,调用采用 va_list的版本,调用 va_end,然后返回。这个函数的两个版本之间不需要代码复制,因为一个版本调用另一个版本。

也许你可以使用可变宏——比如:

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

注意! 变量宏只是 C99

我不知道这是否有帮助,你可以通过引用访问变量。这是一种狡猾的伎俩,但不幸的是,它不允许您在最终的函数定义中使用省略号。

#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