概述
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
int twice(void *arg, va_list ap)
{
apply_func *func = va_arg(ap, apply_func *);
int status = func(arg, ap);
if (status >= 0)
status = func(arg, ap);
return status;
}
twice函数接收一个函数func和它的参数(注意func的参数以奇怪的方式传递,第一个参数是twice的第一个参数arg,而其他参数与func本身组成了twice的ap,是不是有更好 的方式呢?欢迎与作者讨论。),并调用func两次。(注意第二次调用先判断了func返回的值,统一起见,我将一般通过返回负数表示停止或错误,返回0表示正确,而其他正数用于表示返回的更多信息。)
好了,现在我们来看一个实际点的例子:
int traverse_vector(void *arg, va_list ap)
{
int status = 0;
void **a = arg;
apply_func *func = va_arg(ap, apply_func *);
while (*a != NULL)
if ((status = func(*a++, ap)) < 0)
break;
return status;
}
函数traverse_vector接受一个vector(注意不是C++中的vector,而是main函数的参数argv那种以NULL结尾的指针数组),及一个遍历函数func,对vector的每个元素都调用func。如果在访问某个元素时func返回了负值,遍历将会停止(回忆前面的约定,负值表示停止)。你会发现这是非常有用的一个函数。
好了,现在我们打算将上面三个函数联系起来,但在那之前,我们需要另外一个函数——apply。体系中的函数使用va_list传递额外参数,va_list不是直接构造的,我们需要一种方法开始整个调用,这个方法就是apply函数(它不属于这个体系):
int apply(apply_func *func, ...)
{
int status;
void *arg;
va_list ap;
va_start(ap, func);
arg = va_arg(ap, void *);
status = func(arg, ap);
va_end(ap);
return status;
}
函数apply接收一个函数指针,这个函数属于我们考虑的函数体系,apply的其他参数是变长的,它们将被收集到va_list ap中。在调用时,apply先从ap中抽取func的第一个参数arg,将它和剩余的参数ap一起传递给func。
最后
以上就是平常项链为你收集整理的c语言 构造超长字符串,一种使用变长参数为C程序构造灵活回调函数的方法的全部内容,希望文章能够帮你解决c语言 构造超长字符串,一种使用变长参数为C程序构造灵活回调函数的方法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复