va_start及vsnprintf

一、已知函数中的例子。

  
  
  
  
  1. int palPrintf(const char* format,  ...) /*…为可变参数,不限定个数和类型。(后面采用专门的指针指向他)*/    
  2. {    
  3.     va_list ap; //初始化指向可变参数列表的指针    
  4.  
  5.     char buf[MAXLINE]; //定义存放可变参数转化成格式化字符串的数组。    
  6.     int result; //定义变量,用于调用函数。    
  7.  
  8.     va_start(ap, format); //将第一个可变参数的地址赋给ap,即ap指向可变参数列表的开始。    
  9.  
  10.     result = vsnprintf(buf, MAXLINE, format, ap); //将参数ap和format进行转化形成格式化字符串,即可以显示的字符串。    
  11.  
  12.     va_end(ap); //将参数ap复位。    
  13.  
  14.     if (result >= 0)  
  15.     {  
  16.         printf(buf); //打印buf数组  
  17.     }  
  18.  
  19.     return result; // 返回数据给函数调用    

二、va_start、va_list、va_end、va_arg的应用。

       写一个简单的可变参数的例子

       如何写一个简单的可变参数的C函数.写可变参数的 C函数要在程序中用到以下这些宏:

  
  
  
  
  1. #include <stdarg.h>  
  2.  
  3. void va_start(va_list ap, last);  
  4. type va_arg(va_list ap, type);  
  5. void va_end(va_list ap);  
  6. void va_copy(va_list dest, va_list src); 

        va在这里是variable-argument(可变参数)的意思。这些宏定义在stdarg.h中,所以用到可变参数的程序应该包含这个 头文件。

    下面我们写一个简单的可变参数的函数,该函数至少有一个整数参数,第二个参数也是整数,是可选的。函数作用只是打印这两个参数的值。

  
  
  
  
  1. void simple_va_fun(int i, ...)        
  2. {  
  3.     va_list   arg_ptr;  
  4.     int       j=0;  
  5.  
  6.     va_start(arg_ptr,   i);    
  7.     j=va_arg(arg_ptr,   int);     
  8.     va_end(arg_ptr);  
  9.     printf("%d   %d\n",   i,   j);   
  10.     return;  

        从这个函数的实现可以看到,我们使用可变参数应该有以下步骤:
 

 

  • 首先在函数里定义一个va_list型的变量,这里是arg_ptr,这个变量是指向参数的指针.
  • 然后用va_start宏初始化变量arg_ptr,这个宏的第二个参数是第一个可变参数的前一个参数,是一个固定的参数.
  • 然后用va_arg返回可变的参数,并赋值给整数j. va_arg的第二个参数是你要返回的参数的类型,这里是int型.
  • 最后用va_end宏结束可变参数的获取.然后你就可以在函数里使 用第二个参数了.如果函数有多个可变参数的,依次调用va_arg获取各个参数.

 

你可能感兴趣的:(va_start,va_end,va_arg,va_list)