简介

一个可变参数函数是指一个函数拥有不定的参数,即为一个函数可接收多个参数。有时我们会遇到一些算术问题需要用到,比如是计算传入参数的总和,字符串的连接或是其它操作过程,我们在 OC 里也经常使用,最经典的就是 NSLog( C 为 printf ) ,它可以指定格式的输出,格式化输出的内容。

现在我们先来看看普通函数的定义方法。

普通函数

一般我们定义的函数都是指定有多少个参数,如果是有三个参数,我们可以这样写。

- (void)exampleObj:(NSString *)obj obj2:(NSString *)obj2 obj3:(NSString *)obj3
{}

这样有一个问题,如果我们需要计算值,比如需要计算5个或10个数值相加的运行,那我们在函数里是不是需要定义5个或10个的参数?如果有100个数值需要计算 …… 。

可变参数函数

现在,我们可以通过定义 可变参数函数 去实现刚刚的问题,比如我们现在需要传进来参数的数值之和,而且传的参数个数是不固定的。可变参数函数的定义方法很简单,我们在参数的后面加上 ", ..."就可以了,例如。

- (void)exampleObj:(NSString *)obj obj2:(NSString *)obj2 obj3:(NSString *)obj3, ...
{}

现在,我们回到刚刚的难题,这个函数主要是用来计算用户传进来的数值之和。

- (int)sum:(int)num, ...
{int result = num;int objNum;va_list arg_list;va_start(arg_list, num);while ((objNum = va_arg(arg_list, int))) {result += objNum;}va_end(arg_list);return result;
}

va_list:用来保存宏 va_start 、va_arg 和 va_end 所需信息的一种类型。为了访问变长参数列表中的参数,必须声明 va_list 类型的一个对象。

va_start:访问变长参数列表中的参数之前使用的宏,它初始化用 va_list 声明的对象,初始化结果供宏va_arg和va_end使用;

va_arg:展开成一个表达式的宏,该表达式具有变长参数列表中下一个参数的值和类型。每次调用 va_arg 都会修改,用 va_list 声明的对象从而使该对象指向参数列表中的下一个参数。

va_end:该宏使程序能够从变长参数列表用宏 va_start 引用的函数中正常返回。

使用方法

使用方法也很简单,在可变参数里,所有参数均用逗号隔开。

NSLog(@"%d", [self sum:1, 34, nil]);

注意事项

使用的时候,可变参后最后面加一个nil值,这样是代表结束的意思。就像UIAlertView初始化的那样,它一开始不知道你有多少个Button,你可以自由地往里加Button,最后也是由一个nil结束,所以两个是一样的道理。

注意点

1)当我们要创建一个可变参数函数时,必须把省略号( ... )放到参数列表后面,同时也只能拥有一个这样的格式,因为我们不能定义两个可变的参数。

2)当我们需要读取 可变参数列表 时,必须先指定一个变数 va_list ,然后使用宏 va_start 、va_arg、va_end 来获取。

参考:

C可变参数函数 实现 —— http://blog.csdn.net/weiwangchao_/article/details/4857567

维基百科.可變參數函數 —— http://zh.wikipedia.org/wiki/可變參數函數


博文作者:GarveyCalvin

博文出处:http://www.cnblogs.com/GarveyCalvin/

本文版权归作者和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作!

转载于:https://www.cnblogs.com/GarveyCalvin/p/4316427.html

ios开发-Object-C可变参数函数相关推荐

  1. 编写可变参数函数 c语言,C语言可变参数函数的编写

    1. 引言 C语言我们接触的第一个库函数是 printf("hello,world!");其参数个数为1个. 然后,我们会接触到诸如: printf("a=%d,b=%s ...

  2. #{}不自动改参数类型_【Just For Fun】C - 可变参数函数、可变参数宏 __VA_ARGS__、额外的逗号

    [Just For Fun] 本系列纯粹娱乐.研究用.一些旁门左道的东西. 事实上可能完全没用. (๑•̀ω•́๑) 對於可变参数函数.可变参数宏 __VA_ARGS__ , 我曾經有在另一些地方寫過 ...

  3. printf以及可变参数函数讲解(转载)

    printf以及可变参数函数的讲解(转载自 谁不小心的) 添加链接描述 printf以及可变参数函数的讲解 转载自 谁不小心的 链接:https://blog.csdn.net/trochiluses ...

  4. C和指针之实现可变参数函数编译出现expanded from macro ‘va_arg‘ #define va_arg(ap, type) 解决办法

    1.问题 编译可变参数函数里面有va_arg函数的时候提示这个错误 expanded from macro 'va_arg' #define va_arg(ap, type)   2.原因 我没有考虑 ...

  5. c语言怎样获得函数内参数的值_C语言可变参数函数的实现原理

    在本人的<C语言可变参数函数的实现方法>一文中,介绍了如何建立自己的可变参数函数. 下面继续介绍可变参数函数的实现原理. 在汇编语言程序设计中,详细介绍了子程序的实现思想: (1)子程序只 ...

  6. 解析可变参数函数的实现原理(printf,scanf)

    From: http://hi.baidu.com/huifeng00/blog/item/085e8bd198f46ed3a8ec9a0b.html 学习C的语言的时候,肯定接触到标准输出和标准输入 ...

  7. 从printf谈可变参数函数的实现

    作者:戎亚新 摘要:一直以来都觉得printf似乎是c语言库中功能最强大的函数之一,不仅因为它能格式化输出,更在于它的参数个数没有限制,要几个就给几个,来者不拒.printf这种对参数个数和参数类型的 ...

  8. python可变参数函数二阶导数公式_python中函数的可变参数

    简介 INTRODUCTION一.[其实已经用过]可变参数 二.可变参数+普通参数 结合用法1 三.知识要点总结强调 知识回顾: 1.函数关键字参数 2.函数的参数的默认值.必须从右边写到左边. 一. ...

  9. 关于C语言可变参数函数的一些研究和总结

    可变参数函数是指函数参数的个数.类型等是不固定的,需要在用户调用过程中,根据实际传入的参数来确定其类型.个数等信息.例如:可变参数函数printf可谓是在C开发过程中使用最多的标准输出库函数之一,因此 ...

最新文章

  1. 在Visual Studio 2005里,用ActiveSync来同步模拟器(Windows Mobile 5.0 )
  2. 【软件测试】4、测试用例的设计
  3. windows环境安装haproxy及初步配置负载均衡使用示例
  4. thinkphp 内置函数详解
  5. 转:CRC校验之模2除法
  6. pandas函数速查手册(高清版)PDF
  7. Camnetics Suite 2018 CamTrax64 GearTeq GearTrax for AI SE SW
  8. 《大型网站技术架构》读书笔记
  9. 繁体转简体 java_java 中文简体与繁体的转换
  10. signature=bf81fe7f4f17ad23bbd6aa8f365d3bc7,【迅雷高端用户入门手册】(第七集)简单分析迅雷崩溃...
  11. Chart.xkcd图表库
  12. R语言McSpatial_R语言天气可视化应用
  13. 《保卫萝卜》项目实践(2)
  14. 学习机器学习开始的一些别人的看法
  15. 十字路口通行优先权,十字路口通行规则图解
  16. 集成学习实战之 -- RandomForest
  17. vue访问public路径
  18. TF-IDF算法详解与实践
  19. 错误: 找不到或无法加载主类 com.taikang.Application
  20. 图像识别和计算机视觉:如何应用人工智能技术实现自动化检测和识别

热门文章

  1. 试题13 进制转换(十进制-R进制)
  2. 后缀自动机Suffix Links的应用
  3. bzoj 3385: [Usaco2004 Nov]Lake Counting 数池塘(DFS)
  4. bzoj 1687: [Usaco2005 Open]Navigating the City 城市交通(BFS)
  5. torch.utils.data.DataLoader 详解
  6. 用Python3.6操作HBase之HBase-Thrift
  7. matlab2c使用c++实现matlab函数系列教程-unique函数
  8. 贺利坚老师汇编课程41笔记:寻址方式的综合应用修改姚明信息的例题
  9. zookeeper3.4.6完全分布式安装
  10. STL源码剖析学习十四:算法之set相关算法