OC中 多参数省略函数的声明和实现-阿里云开发者社区

开发者社区> 贱见> 正文

OC中 多参数省略函数的声明和实现

简介: <div style="color:rgb(70,70,70); font-family:simsun; font-size:14px; line-height:21px; text-indent:2em"> <span style="word-wrap:normal; word-break:normal">OC开发中,我们也会发现会有类似于NSLog(</span>NSString *
+关注继续查看
OC开发中,我们也会发现会有类似于NSLog(NSString *format, ...)的函数,那么这种带有省略符号的函数是如何内部实现的呢,下面解开神秘面纱。

下面,我们对nslog函数进行展开

void NSLog(NSString *format, ...)
{
// 提取整个参数列表 并输出
        va_list argp = NULL;
va_start(argp, format);
NSString *printfString = nil;
while(printfString = va_arg(argp,id))
        {
              printf("%s",printfString);
        }
va_end(argp);
}



解析:

#define va_start(v,l)    __builtin_va_start(v,l)
va_start(argList,statement):使参数列表指针arg_ptr指向函数参数列表中的第一个可选参数,说明:argN是位于第一个可选参数之前的固定参数,(或者说,最后一个固定参数;…之前的一个参数),函数参数列表中参数在内存中的顺序与函数声明时的顺序是一致的。如果有一va函数的声明是void va_test(char a, char b, char c, …),则它的固定参数依次是a,b,c,最后一个固定参数argN为c,因此就是va_start(arg_ptr, c)。

#define va_end(v)    __builtin_va_end(v)
va_end(arg_ptr):清空参数列表,并置参数指针arg_ptr无效。

#define va_arg(v,l)    __builtin_va_arg(v,l)
va_arg(argList,id):返回参数列表中指针arg_ptr所指的参数,返回类型为type,并使指针arg_ptr指向参数列表中下一个参数。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Python编程语言学习:利用locals函数判断某个变量参数之前是否已经被定义/存在/出现
Python编程语言学习:利用locals函数判断某个变量参数之前是否已经被定义/存在/出现
26 0
vb 操作窗体中控件的函数定义
title(i)   Public Sub AddDataForListView(form1 As Form, controlName As String)'窗体与窗体中要操作的控件名称  form1.Controls(controlName).属性... End Sub
524 0
2014秋C++第13周项目3参考-成绩处理函数版
课程主页在http://blog.csdn.net/sxhelijian/article/details/39152703,课程资源在云学堂“贺老师课堂”同步展示,使用的帐号请到课程主页中查看。  【项目3 - 成绩处理函数版】项目2的另一种实现。输入、求最大/小值等所有功能都通过自定义函数完成。这种设计貌似比项目2麻烦,但其结构有更多的优点,尤其是当程序的规模更大时。通过这个项目,学会将数组
840 0
请教windows下有所有的数据文件,控制文件,但没有参数文件,如何恢复?
我在itpub论坛上遇到的一个问题,并做了回答,分享一下: 一。如果仅仅是参数文件丢失,数据库仍然运行,可用如下代码:set linesize 120set pagesize 999set heading offset feedback offspool F:\spfile.txt  select '*.'||name||'='||value from v$parameter where isdefault ='FALSE';  spool off来获取当前实例的非缺省参数,对生成的临时参数文件进行适当的修改,就可以重新启动数据库。
633 0
MySQL SSD 参数优化
SSD硬盘:慢查询日志可以设置0.5秒,如果超过0.5秒。0.5秒在SSD上最少走了50个IO,就有可能没有用到索引。0.5秒还是有点问题:如果从8000W中找一条记录,如果加上order 等计算耗时,比较小。
3397 0
参数(parameter)和属性(Attribute)的区别
参数(parameter)和属性(Attribute)的区别 区别:  来源不同:    参数(parameter)是从客户端(浏览器)中由用户提供的,若是GET方法是从URL中  提供的,若是POST方法是从请求体(request body)中提供的;    属性(attribute)是服务器端的组件(JSP或者Servlet)利用requst.
859 0
三大连接池的参数说明
1. Apache-DBCP Ø BasicDataSource 相关的参数说明 dataSource: 要连接的 datasource (通常我们不会定义在 server.xml) defaultAutoCommit: 对于事务是否 autoCommit, 默认值为 true ...
927 0
转发:某些函数需要将其一个或多个实参连同类型不变地转发给其他函数
16.47 编写你自己版本的翻转函数,通过调用接受左值和右值引用参数的函数来测试它。 #include #include #include using namespace std; template int compare(const T &a ,const T &b) { ...
570 0
navicat上如何导出视图,函数等
如何导出视图,函数,一般通过linux命令行,如果简单点就用navicat把。 image.png 这样函数,视图都可以导出来 后续更新.....
2842 0
+关注
235
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载