我是靠谱客的博主 平常项链,最近开发中收集的这篇文章主要介绍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。

最后

以上就是平常项链为你收集整理的c语言 构造超长字符串,一种使用变长参数为C程序构造灵活回调函数的方法的全部内容,希望文章能够帮你解决c语言 构造超长字符串,一种使用变长参数为C程序构造灵活回调函数的方法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部