首页 > 其他 > 详细

OC中实现可变参数

时间:2014-01-21 19:19:23      阅读:443      评论:0      收藏:0      [点我收藏+]

通过哨兵参数实现,相当于nil.

1.c语言中

bubuko.com,布布扣
#import <stdio.h>
#import <stdarg.h>

int addemUp(int firstNum,...)
{
    va_list args;//指向参数的指针
    int sum = firstNum;
    int number;
    
    va_start(args, firstNum);//firstNum是...前1个参数
    while(1)
    {
        number = va_arg(args, int);//返回参数列表中指针args所指的参数,返回类型为type,并使指针args指向参数列表中下一个参数。
        printf("number = %d\n",number);
        sum += number;//求和
        if (number == 0)
        {
            break;
        }
    }
    va_end(args);//清空参数列表,并置参数指针args无效
    return sum;

}

int main(int argc, const char * argv[])
{
    printf("sum of %d\n",addemUp(1,2,3,4,5,0));
       return 0;
}
bubuko.com,布布扣

于是哨兵参数(sentinel)这个东西就出来了。上面例子中最后一个参数0就是一个哨兵参数,它的作用就是告诉函数没有参数了。这也是为什么ObjC中[NSArray arrayWithObjects: ...,nil]最后必须以nil参数结尾的原因。
使用__attribute__((sentinel))语法可以告诉编译器这是一个需要哨兵参数的函数。

bubuko.com,布布扣
#import <stdio.h>
#import <stdarg.h>

void printString(char *first,...) __attribute__((sentinel));

void printString(char *first,...)
{
    va_list args;
    va_start(args,first);
    char *string = first;
    while (string != nil)
    {
        printf("%s",string);
        string = va_arg(args, char *);
        printf("\n");
    }
    va_end(args);
    printf("\n");
}

int main(int argc, const char * argv[])
{
    printString("spicy","pony",nil);
        return 0;
}
bubuko.com,布布扣

 


 

bubuko.com,布布扣
-(void)setTitleWithString:(NSString *)title,... __attribute__((sentinel))
{
    NSMutableArray *argsArray = [[NSMutableArray alloc]init];
    if(title)
    {
        [argsArray addObject:title];
        
        va_list params;        //定义一个指向个数可变的参数列表指针
        va_start(params,title);    //va_start  得到第一个可变参数地址        
        NSString *arg;
        while((arg = va_arg(params, NSString *)))//va_arg 指向下一个参数地址
        {
            if(arg)
            {
                [argsArray addObject:arg];
            }
        }
        va_end(params);        //置空
    }
    
    for(NSString *s in argsArray)
    {
        NSLog(@"%@",s);
    }
    
}
bubuko.com,布布扣

OC中实现可变参数

原文:http://www.cnblogs.com/huen/p/3528156.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!