标签:
c++中函数传递的相关知识:点击链接
无论是值传递还是指针传递,传递到函数内的 参数, 同样都包含一个地址。
每一个参数都有一个地址。 这些参数地址,被存储在栈结构中,当函数调用执行结束后,这些地址将被销毁。
我们可以称这个“栈结构”为“可变参数列表”
所谓可变函数,IOS中常用的:
void NSLog(NSString *format, ...)
注意后面的 "...", 你可以在此函数中,给予参数的个数是可变的
使用#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