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 }

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——变长参数实现机制 


 

 

posted on 2010-08-18 23:25  lbsx  阅读(184)  评论(0)    收藏  举报