2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > c语言函数可变长参数 一种使用变长参数为C程序构造灵活回调函数的方法

c语言函数可变长参数 一种使用变长参数为C程序构造灵活回调函数的方法

时间:2021-01-06 07:56:48

相关推荐

c语言函数可变长参数 一种使用变长参数为C程序构造灵活回调函数的方法

该楼层疑似违规已被系统折叠隐藏此楼查看此楼

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。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。