可以看到,其中 va_list实际上只是一个参数指针,va_start根据你提供的后一个固定参数来获取第一个可变参数的地址,va_arg将指针指向下一个可变参数然后返回当前值,va_end只是简单的将指针清0.

  用下面的代码进行测试:

  1. int main()  
  2.     Sum(3, 10, 20, 30); 
  3.     SumStr(5, "aa", "bb", "cc", "dd", "ff"); 
  4.      
  5.     SumNew(3, 1, 2, 3); 
  6.     SumStrNew(3, "12", "34", "56"); 
  7.  
  8.     system("pause"); 
  9.  
  10.     return 0; 
  11. }

  结果如下:

  我们上面的例子传的可变参数都是4字节的,如果我们的可变参数传的是一个结构体,结果会怎么样呢?

  下面的例子我们传的可变参数是std::string

  1. //use va_arg,  praram is std::string 
  2. void SumStdString(int nCount, ) 
  3.     string str; 
  4.     va_list vl = 0; 
  5.     va_start(vl, nCount); 
  6.  
  7.     for(int i=0; i<nCount; ++i) 
  8.     { 
  9.         string p = va_arg(vl, string); 
  10.         cout <<  p << endl; 
  11.         str += p; 
  12.     } 
  13.  
  14.     cout << "SumStdString:" << str << endl << endl; 
  15. int main()  
  16. Sum(3, 10, 20, 30); 
  17. SumStr(5, "aa", "bb", "cc", "dd", "ff"); 
  18. SumNew(3, 1, 2, 3); 
  19. SumStrNew(3, "12", "34", "56"); 
  20. string s1("hello "); 
  21. string s2("world "); 
  22. string s3("!"); 
  23. SumStdString(3, s1, s2, s3); 
  24. system("pause"); 
  25. return 0; 
  26. }