C语言的可变参数
代码 1 #include <stdio.h>
2 #include <stdarg.h>
3
4 void PrintFloats ( int amount, ...)
5 {
6 int i;
7 double val;
8 printf ("Floats passed: ");
9 va_list vl;
10 va_start(vl,amount);
11 for (i=0;i<amount;i++)
12 {
13 val=va_arg(vl,double);
14 printf ("\t%.2f",val);
15 }
16 va_end(vl);
17 printf ("\n");
18 }
19
20 int main ()
21 {
22 PrintFloats (3,3.14159,2.71828,1.41421);
23 return 0;
24 }
2 #include <stdarg.h>
3
4 void PrintFloats ( int amount, ...)
5 {
6 int i;
7 double val;
8 printf ("Floats passed: ");
9 va_list vl;
10 va_start(vl,amount);
11 for (i=0;i<amount;i++)
12 {
13 val=va_arg(vl,double);
14 printf ("\t%.2f",val);
15 }
16 va_end(vl);
17 printf ("\n");
18 }
19
20 int main ()
21 {
22 PrintFloats (3,3.14159,2.71828,1.41421);
23 return 0;
24 }
va_start初始化指针,va_arg读取参数,va_end将指针置0。
va_start实际上就是取得变长参数在栈中的起始地址,栈由高地址向低地址分配的特点及C语言从右向左将参数压栈的特点决定了其实现方式。
#define va_start(ap,v) ( ap = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v) )
v是最后一个确定的函数,通过取其地址,加上其字节对齐后的内存大小,就可以取得可变参数的首地址,详细见参考。
参考:
C++ : Reference : C Library : cstdarg (stdarg.h) : va_start
va_list,va_start,va_arg,va_end——变长参数实现机制

浙公网安备 33010602011771号