我有大约30个可变函数。每个参数都接受一个路径作为最后一个参数,例如:
bool do_foo(struct *f, int q, const char *fmt, ...)
在每个函数中,我必须检查扩展后的格式是否小于或等于某个特定的大小。因此,我发现自己复制/粘贴了相同的代码块来检查vsnprintf()
没有打印多少字符,并相应地设置errno
,然后退出编写。
我想要做的是写一个函数来做这件事,它将返回一个已知为安全大小的静态分配的(扩展的)字符串,或者在失败时返回新初始化的字符串,可以根据NULL进行检查。检查还必须确定字符串是绝对路径还是相对路径,这会影响字符串的安全大小。它有很多重复的代码,而且开始有异味了。
有没有一种方法可以将elipsis的内容从我的函数的入口传递到另一个函数?或者我必须先调用va_start()
,然后再将va_list
传递给助手函数?
编辑:
我根本不反对将va_list
传递给帮助器,我只是想确保没有其他东西存在。在我看来,编译器似乎知道可变参数从哪里开始,所以我很好奇是否可以告诉它传递这些参数。
发布于 2009-03-30 04:21:19
您不能,您只能将参数作为va_list
传递。请参阅comp.lang.c FAQ。
通常,如果您正在用C语言编写可变函数(即接受可变数量参数的函数),则应该为每个函数编写两个版本:一个接受省略号(...
),另一个接受va_list
。带省略号的版本应该调用va_start
,调用带va_list
的版本,调用va_end
,然后返回。不需要在函数的两个版本之间重复代码,因为一个版本调用另一个版本。
发布于 2009-03-30 06:00:04
也许你可以使用可变的宏-就像这样:
#define FOO(...) do { do_some_checks; myfun(__VA_ARGS__); } while (0)
NB!变量宏仅适用于C99
发布于 2012-06-01 12:53:19
我不知道这是否有用,你可以通过引用来访问变量。这是一种偷偷摸摸的技巧,但不幸的是,它不允许您在最终的函数定义中使用省略号。
#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;
}
在我的pc上,它输出
$ ./a.out
BFFEB0B0 4 BFFEB0B4 6 BFFEB0B8 7 BFFEB0BC 8 BFFEB0C0 0
https://stackoverflow.com/questions/695982
复制相似问题