建设医院网站ppt模板下载,网站站内优化方法,北京最大做网站的公司,网站软件开发该楼层疑似违规已被系统折叠 隐藏此楼查看此楼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的参数以奇怪…该楼层疑似违规已被系统折叠 隐藏此楼查看此楼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。