《C++ primer》学习笔记之二十一:有趣的变参函数

来源:互联网 发布:博客源码资源站 编辑:程序博客网 时间:2024/06/05 17:51
  
有趣的变参函数:
 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?