可以看到,我们上面的实现有硬编码的味道,也有没有做字节对齐,为此系统专门给我们封装了一些支持可变参数的宏:

  1. //typedef char *  va_list; 
  2. //#define _ADDRESSOF(v)   ( &reinterpret_cast<const char &>(v) ) 
  3. //#define _INTSIZEOF(n)   ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) 
  4. //#define _crt_va_start(ap,v)  ( ap = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v) ) 
  5. //#define _crt_va_arg(ap,t)    ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) 
  6. //#define _crt_va_end(ap)      ( ap = (va_list)0 ) 
  7. //#define va_start _crt_va_start 
  8. //#define va_arg _crt_va_arg 
  9. //#define va_end _crt_va_end 
  10. //#define _ADDRESSOF(v)   ( &reinterpret_cast<const char &>(v) ) 
  11. //#define _INTSIZEOF(n)   ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) 
  12. //#define _crt_va_start(ap,v)  ( ap = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v) ) 
  13. //#define _crt_va_arg(ap,t)    ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) 
  14. //#define _crt_va_end(ap)      ( ap = (va_list)0 ) 
  15. //#define va_start _crt_va_start 
  16. //#define va_arg _crt_va_arg 
  17. //#define va_end _crt_va_end

  用系统的这些宏,我们的代码可以这样写了:

  1. //use va_arg, praram is int 
  2. int SumNew(int nCount, ) 
  3.     int nSum = 0; 
  4.     va_list vl = 0; 
  5.     va_start(vl, nCount); 
  6.  
  7.     for(int i=0; i<nCount; ++i) 
  8.     { 
  9.         int n = va_arg(vl, int); 
  10.         cout << n << endl; 
  11.         nSum += n; 
  12.     } 
  13.  
  14.     va_end(vl); 
  15.     cout << "SumNew:" << nSum << endl << endl; 
  16.     return nSum; 
  17.  
  18. //use va_arg,  praram is char* 
  19. string SumStrNew(int nCount, ) 
  20.     string str; 
  21.     va_list vl = 0; 
  22.     va_start(vl, nCount); 
  23.  
  24.     for(int i=0; i<nCount; ++i) 
  25.     { 
  26.         char* p = va_arg(vl, char*); 
  27.         cout <<  p << endl; 
  28.         str += p; 
  29.     } 
  30.  
  31.     cout << "SumStrNew:" << str << endl << endl; 
  32.     return str; 
  33. }