有趣的变参函数:
ascii中用宏:va_list, va_arg, va_start, va_end 四个宏来实现参数变化的函数,估计其原理是:
调用函数时,传入的参数在栈中按(高地址——〉低地址,最后一个参数——〉第一个参数)排列,知道第一个参数的地址,
那么只需要顺序地知道各个参数的类型就可以取出各个参数的值。
例如:
#include <stdarg.h>
void f(int first, int second, ...){ //必须知道至少一个参数。why?为了知道参数的起始地址吗?
cout << "f(" << first;
va_list vaList; //宏va_list
va_start(vaList, second); //宏va_start要以最后一个参数为自己的参数。why?为了知道变参的起始地址吗?
int i = va_arg(vaList, int); //宏va_arg要以类型(比如int)为自己的参数,“返回值”为该类型的值,此即为实际传入的参数
//注意:依次返回second参数后面的参数,不含second。
while ( i != -1 ){
cout << ", " << i;
i = va_arg(vaList, int);
}
va_end(vaList); //宏va_end一般负责将指针vaList=0
cout << ")/n";
}
另:还有一种unix的一套实现方式,也是一组宏,但VC中好像不能用。How do?