美文网首页
不定参数引出的va_start,va_arg, va_end

不定参数引出的va_start,va_arg, va_end

作者: skogt | 来源:发表于2019-02-28 22:23 被阅读0次

不定参数引出的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_argva_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到新的东西了吗?

相关文章

网友评论

      本文标题:不定参数引出的va_start,va_arg, va_end

      本文链接:https://www.haomeiwen.com/subject/gtsluqtx.html