cc810610186的笔记 https://bbs.21ic.com/?589808 [收藏] [复制] [RSS]

日志

可变参数

已有 605 次阅读2011-3-4 13:29 |个人分类:c|系统分类:嵌入式系统| 可变参数

写可变参数的C函数要在程序中用到以下这些宏:
void va_start( va_list arg_ptr, prev_param );
type va_arg( va_list arg_ptr, type );
void va_end( va_list arg_ptr );


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


以下为简单的 pintf() 程序:


 1 #include <stdio.h>
  2 #include <stdarg.h>
  3
  4 void my_printf (const char *fmt, ...);
  5
  6 int main(int argc, char *argv)
  7 {  
  8     my_printf ("test: %c, %d, %s\n", 'a', -7889, "hello");
  9     return 0;
 10 }  
 11        
 12
 13 char *baseconv (unsigned int num, int base)
 14 {  
 15     static char ret_buf[33];
 16     char *p;
 17    
 18     if (base < 2 || base > 16)
 19         return NULL;
 20    
 21     p = &ret_buf[sizeof(ret_buf) - 1];
 22     *p = '\0';
 23
 24     do
 25     {
 26         *--p  = "0123456789abcdef"[num % base];
 27         num /= base;
 28     }while (num != 0);
 29    
 30     return p;
 31 }
 32  


 33 void my_printf (const char *fmt, ...)
 34 {  
 35     va_list argp;
 36     const char *p;
 37     int i;
 38     char *s=NULL;
 39    
 40     va_start (argp, fmt);
 41    
 42     for (p = fmt; *p != '\0'; p++)
 43     {  
 44         if ( *p != '%')
 45         {  
 46             putchar (*p);
 47             continue;
 48         }
 49        
 50         switch ( *++p )
 51         {  
 52             case 'c':
 53                 i = va_arg (argp, int);
 54                 putchar (i);
 55                 break;
 56             case 'd':
 57                 i = va_arg (argp, int);
 58                 if ( i < 0 )
 59                 {  
 60                     i = -i;
 61                     putchar ('-');
 62                 }
 63                 fputs ( baseconv (i, 10), stdout);
 64                 break;
 65             case 's':
 66                 s = va_arg (argp, char *);
 67                 fputs (s, stdout);
 68                 break;
 69             case '%':
 70                 putchar ('%');
 71                 break;
 72         }
 73     }
 74 }
                           


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)