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
- OC中实现可变参数
- OC 可变参数
- oc 可变参数传递
- OC的可变参数
- oc遍历所有可变参数
- C中可变参数函数实现
- C中可变参数函数实现
- JavaScript中如何实现函数参数可变
- c语言中可变参数的实现
- C语言中可变参数的实现
- c语言中如何实现可变参数
- C语言中可变参数的实现
- cstdarg中可变参数的实现
- C语言中可变参数函数实现
- C语言中实现可变参数函数
- C语言中实现可变参数函数
- OC中对外不可变、对内实现可变
- 可变参数函数实现
- 外观模式(手动内存)
- 设计原则之最少知道原则
- 设计6大原则
- OC字符串
- 集合
- OC中实现可变参数
- 字符串、集合补充
- kvc、kvo、通知
- 动态类型
- 类目、延展、协议
- 归档
- NSDate、NSCalendar、NSDateFormatter
- NSFileManager、NSFileHandle
- 浅拷贝、深拷贝