|||
写可变参数的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 }