我有大约30个可变函数。每个人都接受一个路径作为最终参数,例如:
bool do_foo(struct *f, int q, const char *fmt, ...)
在每个函数中,我必须检查扩展格式是否小于或等于特定大小。所以,我发现自己复制/粘贴相同的代码块来检查有多少个字符vsnprintf()
没有打印,相应地设置errno
并保释出写入。
我想要做的是编写一个函数来执行此操作,它将返回一个已知为安全大小的静态分配(扩展)字符串,或者在失败时重新初始化的字符串,可以针对NULL进行检查。检查还必须确定字符串是绝对路径还是相对路径,这会影响字符串的安全大小。这是很多重复的代码,它开始闻起来。
有没有办法可以将elipsis的内容从我的函数的条目传递给另一个函数?或者我是否必须先调用va_start()
,然后将va_list
传递给辅助函数?
修改
我完全不反对将va_list
传递给助手,我只是想确保没有别的东西存在。在我看来,编译器了解可变参数的开始位置,所以我只是好奇我是否可以告诉它传递它们。
答案 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传递给帮助者。