可变参数是c语言函数中参数的个数和类型是不定的;具有可变参数的函数,称为可变参数函数。要注意的是,可变参数函数必须有一个以上的固定参数,可变参数必须作为最后一个函数参数。
...代表的就是可变参数,将来可以传递任意个数、任意类型参数
OC中的NSLog函数就是可变参数函数。
FOUNDATION_EXPORT void NSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2) NS_NO_TAIL_CALL;
FOUNDATION_EXPORT void NSLogv(NSString *format, va_list args) NS_FORMAT_FUNCTION(1,0) NS_NO_TAIL_CALL;
//模拟一下NSLog中调用NSLogv的过程
void printArgs(int numArgs, ...){
va_list args;
va_start(args, numArgs);//初始化args,指向最后一个固定参数numArgs。
NSLogv(@"%@, %@, %@", args);//至于NSLogv内部如何获取三个参数值,参看下面的sum函数
va_end(args); //args设置为NULL
}
//不知道有多少个数相加,所以使用了可变参数
//固定参数n,仅仅起了个定位作用,一般还可以作为可变参数个数使用。
int sum(int n, ...){
va_list ap;//定于一个可变列表,用来便利可变参数
va_start(ap, n);//初始化ap,让其指向最后一个固定参数n
int sum = 0, ret = 0;
//va_arg宏在第一次调用时,会让ap指向第一个可变参数,后续,每一次调用,都将指向下一个可变参数。
while ((ret = va_arg(ap, int))) {//如果参数类型不能,那就对va_arg指定具体类型
sum += ret;
}
va_end(ap);//清理ap,使其不再可用
return sum;
}