通过哨兵参数实现,相当于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
",number);
sum += number;//求和
if (number == 0)
{
break;
}
}
va_end(args);//清空参数列表,并置参数指针args无效
return sum;
}
int main(int argc, const char * argv[])
{
printf("sum of %d
",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("
");
}
va_end(args);
printf("
");
}
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);
}
}
http://www.cnblogs.com/huen/p/3528156.html