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

  用下面的代码进行测试:

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

  结果如下:

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

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

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