美文网首页iOS DeveloperiOS点点滴滴
可变参数va_list、va_start、va_arg、va_e

可变参数va_list、va_start、va_arg、va_e

作者: Jabir_Zhang | 来源:发表于2016-05-10 10:18 被阅读789次

    摘要

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

    ideachObject;

    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_e

        本文链接:https://www.haomeiwen.com/subject/unserttx.html