OC中实现可变参数

来源:互联网 发布:linux root鉴定错误 编辑:程序博客网 时间:2024/06/07 09:04

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

1.c语言中

#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;}

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

#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;}

 


 

-(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);    }    }

 

 

0 0
原创粉丝点击