可变参数va_list、va_start、va_arg、va_end原理及使用

摘要

对于可变参数这种什么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];

===================

很多时候写一些通用的东西的时候可以用到这个,比如说仓管系统,你要搜索出多种不同条件的货物,你可以用此方法传多个条件参数,写一个通用的方法返回你的货物。不过也有很多替代方法, 比如把多个参数放入数组传值也是可以的。看自己选择啦,哈哈!

你可能感兴趣的:(可变参数va_list、va_start、va_arg、va_end原理及使用)