代码1#include<stdio.h>
2#include<stdarg.h>
3
4voidPrintFloats (intamount, ...)
5{
6inti;
7doubleval;
8printf ("Floats passed:");
9va_list vl;
10va_start(vl,amount);
11for(i=0;i<amount;i++)
12{
13val=va_arg(vl,double);
14printf ("t%.2f",val);
15}
16va_end(vl);
17printf ("n");
18}
19
20intmain ()
21{
22PrintFloats (3,3.14159,2.71828,1.41421);
23return0;
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——变长参数实现机制
原文链接: https://www.cnblogs.com/lbsx/archive/2010/08/18/1802891.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/14015
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!