码迷,mamicode.com
首页 > 其他好文 > 详细

函数的可变参数

时间:2015-09-06 17:56:48      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:

1,函数参数

c++中函数传递的相关知识:点击链接

无论是值传递还是指针传递,传递到函数内的 参数, 同样都包含一个地址。

每一个参数都有一个地址。 这些参数地址,被存储在栈结构中,当函数调用执行结束后,这些地址将被销毁。

我们可以称这个“栈结构”为“可变参数列表”

2,可变参数

所谓可变函数,IOS中常用的:

void NSLog(NSString *format, ...)

注意后面的 "...", 你可以在此函数中,给予参数的个数是可变的

3,可变参数的具体实现

使用#include<stdarg.h>来实现,这个头文件声明了一个类型va_list和三个宏——va_start、va_arg、va_end。

#ifndef _VA_LIST
typedef __builtin_va_list va_list;
#define _VA_LIST
#endif
#define va_start(ap, param) __builtin_va_start(ap, param)
#define va_end(ap)          __builtin_va_end(ap)
#define va_arg(ap, type)    __builtin_va_arg(ap, type)

在函数内,我们可以获得其“可变参数列表”。

va_list,声明一个变量,指向函数的 “可变参数列表”

va_arg(va_list list, type),传递参数列表va_list 和将被返回的参数的类型。va_arg()的返回值是当前的参数。

对参数列表的所有参数,调用  va_arg,获得所有参数。

va_start(ap, param) 和 va_end(ap) 分别标识 开始和结束。

所以, NSLog的实现,应该是这个样子:

void NSLog(NSString *format, ...) {
    va_list list;
    va_start(list, format);
    for(id arg=format; arg!=nil; arg=va_arg(list,id)) {
        //获取所有的擦数,并打印
    }
    va_end(list);
}

 

函数的可变参数

标签:

原文地址:http://www.cnblogs.com/pennbj/p/4786431.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!