[C++基础]040_可变参数va_list的一段示例代码

 1 #include <stdio.h>
 2 #include <stdarg.h>
 3 
 4 void WriteFormatted (FILE * stream, const char * format, ...)
 5 {
 6   va_list args;
 7   va_start (args, format);
 8   vfprintf (stream, format, args);
 9   va_end (args);
10 }
11 
12 int main ()
13 {
14    FILE * pFile;
15 
16    pFile = fopen ("myfile.txt","w");
17 
18    WriteFormatted (pFile,"Call with %d variable argument.\n",1);
19    WriteFormatted (pFile,"Call with %d variable %s.\n",2,"arguments");
20 
21    fclose (pFile);
22    getchar();
23    return 0;
24 }

va_list的实现原理,这里简单的介绍一下:

     在进程中,堆栈地址是从高到低分配的.当执行一个函数的时候,将参数列表入栈,压入堆栈的高地址部分,然后入栈函数的返回地址,接着入栈函数的执行代码,这个入栈过程,堆栈地址不断递减.

     总之,函数在堆栈中的分布情况是:地址从高到低,依次是:函数参数列表,函数返回地址,函数执行代码段.堆栈中,各个函数的分布情况是倒序的.即最后一个参数在列表中地址最高部分,第一个参数在列表地址的最低部分.

     而上面用到的几个看似函数的函数,其实是宏,它们的作用就是获取函数的参数列表的地址,它们的定义如下:

1   #define _INTSIZEOF(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) )
2   #define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) ) //第一个可选参数地址
3   #define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) //下一个参数地址
4   #define va_end(ap) ( ap = (va_list)0 ) // 将指针置为无效

 

转载于:https://www.cnblogs.com/alephsoul-alephsoul/archive/2012/12/19/2825664.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值