不定参数引出的va_start,va_arg, va_end
写过C,C++,iOS的同学大概都知道,函数支持可变参数。对C不是特别清楚的iOS同学来说,可能会比较疑惑,我传入可变参数,那我该怎么解析呢???
+ (instancetype)tupleWithObjects:(id)object, ... {
RACTuple *tuple = [[self alloc] init];
va_list args;
va_start(args, object);
NSUInteger count = 0;
for (id currentObject = object; currentObject != nil; currentObject = va_arg(args, id)) {
++count;
}
va_end(args);
上面举例了用到可变参数的方法,例子中我们也看到了今天要讲的猪脚。那么va_start
,va_end
,va_arg
到底是什么东西呢,可能眼睛比较亮的同学已经注意到了。
下面是 va_start()
宏的声明。
ap -- 这是一个 va_list 类型的对象,它用来存储通过 va_arg 获取额外参数时所必需的信息。
last_arg -- 最后一个传递给函数的已知的固定参数。
void va_start(va_list ap, last_arg);
这个宏必须在使用 va_arg
和va_end
之前被调用。调用的顺序例子中也给到了。这些函数被定义在<stdarg.h>中
其实从这些函数命名中我们大概都猜的出来代表什么。为了更好的认识这些函数,我们再举一个例子方便大家理解。
#include<stdarg.h>
#include<stdio.h>
int sum(int num_args, ...) {
int result = 0;
va_list args;
va_start(args, num_args);
for (int i = 0; i < num_args; i++) {
result += va_arg(args, int);
}
va_end(args);
return result;
}
int main(void)
{
printf("10、20 和 30 的和 = %d\n", sum(3, 10, 20, 30) );
return 0;
}
输出的结果不言而喻,10、20 和 30 的和 = 60
你今天get
到新的东西了吗?
网友评论