ios开发-Object-C可变参数函数
简介
一个可变参数函数是指一个函数拥有不定的参数,即为一个函数可接收多个参数。有时我们会遇到一些算术问题需要用到,比如是计算传入参数的总和,字符串的连接或是其它操作过程,我们在 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可变参数函数相关推荐
- 编写可变参数函数 c语言,C语言可变参数函数的编写
1. 引言 C语言我们接触的第一个库函数是 printf("hello,world!");其参数个数为1个. 然后,我们会接触到诸如: printf("a=%d,b=%s ...
- #{}不自动改参数类型_【Just For Fun】C - 可变参数函数、可变参数宏 __VA_ARGS__、额外的逗号
[Just For Fun] 本系列纯粹娱乐.研究用.一些旁门左道的东西. 事实上可能完全没用. (๑•̀ω•́๑) 對於可变参数函数.可变参数宏 __VA_ARGS__ , 我曾經有在另一些地方寫過 ...
- printf以及可变参数函数讲解(转载)
printf以及可变参数函数的讲解(转载自 谁不小心的) 添加链接描述 printf以及可变参数函数的讲解 转载自 谁不小心的 链接:https://blog.csdn.net/trochiluses ...
- 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.原因 我没有考虑 ...
- c语言怎样获得函数内参数的值_C语言可变参数函数的实现原理
在本人的<C语言可变参数函数的实现方法>一文中,介绍了如何建立自己的可变参数函数. 下面继续介绍可变参数函数的实现原理. 在汇编语言程序设计中,详细介绍了子程序的实现思想: (1)子程序只 ...
- 解析可变参数函数的实现原理(printf,scanf)
From: http://hi.baidu.com/huifeng00/blog/item/085e8bd198f46ed3a8ec9a0b.html 学习C的语言的时候,肯定接触到标准输出和标准输入 ...
- 从printf谈可变参数函数的实现
作者:戎亚新 摘要:一直以来都觉得printf似乎是c语言库中功能最强大的函数之一,不仅因为它能格式化输出,更在于它的参数个数没有限制,要几个就给几个,来者不拒.printf这种对参数个数和参数类型的 ...
- python可变参数函数二阶导数公式_python中函数的可变参数
简介 INTRODUCTION一.[其实已经用过]可变参数 二.可变参数+普通参数 结合用法1 三.知识要点总结强调 知识回顾: 1.函数关键字参数 2.函数的参数的默认值.必须从右边写到左边. 一. ...
- 关于C语言可变参数函数的一些研究和总结
可变参数函数是指函数参数的个数.类型等是不固定的,需要在用户调用过程中,根据实际传入的参数来确定其类型.个数等信息.例如:可变参数函数printf可谓是在C开发过程中使用最多的标准输出库函数之一,因此 ...
最新文章
- 在Visual Studio 2005里,用ActiveSync来同步模拟器(Windows Mobile 5.0 )
- 【软件测试】4、测试用例的设计
- windows环境安装haproxy及初步配置负载均衡使用示例
- thinkphp 内置函数详解
- 转:CRC校验之模2除法
- pandas函数速查手册(高清版)PDF
- Camnetics Suite 2018 CamTrax64 GearTeq GearTrax for AI SE SW
- 《大型网站技术架构》读书笔记
- 繁体转简体 java_java 中文简体与繁体的转换
- signature=bf81fe7f4f17ad23bbd6aa8f365d3bc7,【迅雷高端用户入门手册】(第七集)简单分析迅雷崩溃...
- Chart.xkcd图表库
- R语言McSpatial_R语言天气可视化应用
- 《保卫萝卜》项目实践(2)
- 学习机器学习开始的一些别人的看法
- 十字路口通行优先权,十字路口通行规则图解
- 集成学习实战之 -- RandomForest
- vue访问public路径
- TF-IDF算法详解与实践
- 错误: 找不到或无法加载主类 com.taikang.Application
- 图像识别和计算机视觉:如何应用人工智能技术实现自动化检测和识别
热门文章
- 试题13 进制转换(十进制-R进制)
- 后缀自动机Suffix Links的应用
- bzoj 3385: [Usaco2004 Nov]Lake Counting 数池塘(DFS)
- bzoj 1687: [Usaco2005 Open]Navigating the City 城市交通(BFS)
- torch.utils.data.DataLoader 详解
- 用Python3.6操作HBase之HBase-Thrift
- matlab2c使用c++实现matlab函数系列教程-unique函数
- 贺利坚老师汇编课程41笔记:寻址方式的综合应用修改姚明信息的例题
- zookeeper3.4.6完全分布式安装
- STL源码剖析学习十四:算法之set相关算法