美文网首页
不定参数引出的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