摘要
对于可变参数这种什么va_list之类的东西,很多人会觉得很陌生,其实这个一点都不陌生,反而说很是熟悉。奇怪吧,举个你立马恍然的例子,UIAlertView的init方法中otherButtonTitles:(NSString*)otherButtonTitles, ...,这就是可变参数。是不是顿时恍然,那咱们就具体的来说下这个可变参数的使用。
原理
在VC++6.0的include有一个stdarg.h头文件,有如下几个宏定义:
#define _INTSIZEOF(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) )
#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) ) //第一个可选参数地址
#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) //下一个参数地址
#define va_end(ap) ( ap = (va_list)0 ) // 将指针置为无效
使用
VA_LIST 是在C语言中解决变参问题的一组宏
VA_LIST的用法:
(1)首先在函数里定义一具VA_LIST型的变量,这个变量是指向参数的指针
(2)然后用VA_START宏初始化变量刚定义的VA_LIST变量,这个宏的第二个参数是第一个可变参数的前一个参数,是一个固定的参数。
(3)然后用VA_ARG返回可变的参数,VA_ARG的第二个参数是你要返回的参数的类型。
(4)最后用VA_END宏结束可变参数的获取。然后你就可以在函数里使用第二个参数了。如果函数有多个可变参数的,依次调用VA_ARG获取各个参数。
(PS:哈哈哈,是不是很专业,感觉13装的太过了,原理和上面的使用是网上copy来的)
我觉得原理和使用写的很通俗,至少我这样的理解能力都理解了!
惯例:
写段简单的具体使用的代码给大家看看,加深理解和学会应用
- (void)mutableParamList:(NSString*)firstPara,...
{
va_list arguments;
id eachObject;
if(firstPara) {
NSLog(@"1:%@",firstPara);
va_start(arguments, firstPara);
while((eachObject =va_arg(arguments,id))) {
NSLog(@"2:%@",eachObject);
}
va_end(arguments);
}
}
===================
调用:[selfmutableParamList:@"aaaa",@"bbbb",@"cccc",@"dddd",nil];
===================
很多时候写一些通用的东西的时候可以用到这个,比如说仓管系统,你要搜索出多种不同条件的货物,你可以用此方法传多个条件参数,写一个通用的方法返回你的货物。不过也有很多替代方法, 比如把多个参数放入数组传值也是可以的。看自己选择啦,哈哈!