一步步学嵌入式操作系统笔记4---- printf中va_list的实现

来源:互联网 发布:vb关机代码 编辑:程序博客网 时间:2024/06/18 18:09
  首先声明下面这个va_list的实现,只适用于32位的机器,像单片机这样int 是2Byte的不适合,但是原理是一样的。

点击(此处)折叠或打开

  1. typedef char * va_list;
  2. #define _INTSIZEOF(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) )
  3. #define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )
  4. #define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
  5. #define va_end(ap) ( ap = (va_list)0 )

  6. void test_vparameter(int i,...)
  7. {
  8.     int mm;
  9.     va_list argv;
  10.     va_start(argv,i);
  11.     while(i--)
  12.     {
  13.         mm=va_arg(argv,int);
  14.         putc(mm);
  15.     }
  16.     va_end(argv);
  17. }
1. va_list
   在调用va_start之前参数都己压入栈中,因为其它的都是可变参数,只有fmt是确定的,fmt是最后压入栈中的,并且每个参数在栈中占用的空间是一样的,所以可以由第一个参数fmt依次推算出其它参数的地址。
2. va_start
   a. (va_list)&t 取第一个参数fmt的地址
   b. (va_list)&t+_INT_SIZEOF(t) 第一个参数的地址加上参数的长度,此时ap指向了第二个参数即ap指向了第一个可变的参数。

3. va_arg
   a. ap+=__INT_SIZEOF(t)
ap移动指向第二个可变参数
   b. (ap+=__INT_SIZEOF(t))-__INT_SIZEOF(t)
用指针运算,确定第一个可变参数的地址
   c. (t*)((ap+=__INT_SIZEOF(t))-__INT_SIZEOF(t))
进行强制类型转化
   d. (*(t*)((ap+=__INT_SIZEOF(t))-__INT_SIZEOF(t)))
取出第一个可变参数地址中的值
<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
阅读(229) | 评论(0) | 转发(0) |
0

上一篇:cmake mfc vs2010

下一篇:java c++ new区别

相关热门文章
  • linux 常见服务端口
  • xmanager 2.0 for linux配置
  • 【ROOTFS搭建】busybox的httpd...
  • openwrt中luci学习笔记
  • 什么是shell
  • linux dhcp peizhi roc
  • 关于Unix文件的软链接
  • 求教这个命令什么意思,我是新...
  • sed -e "/grep/d" 是什么意思...
  • 谁能够帮我解决LINUX 2.6 10...
给主人留下些什么吧!~~
评论热议
0 0