penn-wang
一位老和尚,他身边聚拢着一帮虔诚的弟子。这一天,他嘱咐弟子每人去南山打一担柴回来。弟子们匆匆行至离山不远的河边,人人目瞪口呆。只见洪水从山上奔泻而下,无论如何也休想渡河打柴了。无功而返,弟子们都有些垂头丧气。唯独一个小和尚与师傅坦然相对。师傅问其故,小和尚从怀中掏出一个苹果,递给师傅说,过不了河,打不了柴,见河边有棵苹果树,我就顺手把树上唯一的一个苹果摘来了。后来,这位小和尚成了师傅的衣钵传人。

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);
}

 

posted on 2015-09-06 16:30  penn-wang  阅读(273)  评论(0)    收藏  举报