一步步学嵌入式操作系统笔记4---- printf中va_list的实现
来源:互联网 发布:vb关机代码 编辑:程序博客网 时间:2024/06/18 18:09
首先声明下面这个va_list的实现,只适用于32位的机器,像单片机这样int 是2Byte的不适合,但是原理是一样的。
点击(此处)折叠或打开
- typedef char * va_list;
- #define _INTSIZEOF(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) )
- #define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )
- #define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
- #define va_end(ap) ( ap = (va_list)0 )
- void test_vparameter(int i,...)
- {
- int mm;
- va_list argv;
- va_start(argv,i);
- while(i--)
- {
- mm=va_arg(argv,int);
- putc(mm);
- }
- va_end(argv);
- }
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)))
取出第一个可变参数地址中的值
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
- 一步步学嵌入式操作系统笔记4---- printf中va_list的实现
- printf中va_list的实现
- 《一步步写嵌入式操作系统:ARM编程的方法与实践》书中实践环境的搭建
- 一步步写嵌入式操作系统:ARM编程的方法与实践
- 实现自己的嵌入式printf函数
- 可变参数函数printf的实现(不使用va_list等内置宏定义)
- 嵌入式中通过可变参数va实现printf
- 一步步学Linux网络编程--ping命令的实现分析
- va_list简单介绍及初步实现printf函数
- 很好的一步步写嵌入式操作系统-ARM编程方法资源网址
- printf函数中“va_list 、va_start、 va_arg、 va_end” 使用说明
- 别人学韦东山嵌入式的笔记
- va_list、va_start、va_end(用于实现函数参数的个数可变的函数,如scanf()/printf()系列函数)
- 实现一个最简单的嵌入式操作系统
- 实现一个最简单的嵌入式操作系统
- 嵌入式操作系统VxWorks下PPPoE的实现
- 实现一个最简单的嵌入式操作系统
- 实现一个最简单的嵌入式操作系统
- 从Win32程序中的主函数中获取命令行参数 _twinmain
- WinDbg 设置断点
- android-应用认领包未签名
- java 接口(一)
- cmake mfc vs2010
- 一步步学嵌入式操作系统笔记4---- printf中va_list的实现
- java c++ new区别
- vim 撤销 恢复
- gtest expect_streq
- mingw nmake gnu_make
- 为什么说“懒”是程序员应有的美德?
- VTK中的布尔运算——vtkBooleanOperationPolyDataFilter
- [Inferior 1 (process 4672) exited normally]
- mingw gdb .gdbinit
原创粉丝点击
热门IT博客
热门问题
老师的惩罚
人脸识别
我在镇武司摸鱼那些年
重生之率土为王
我在大康的咸鱼生活
盘龙之生命进化
天生仙种
凡人之先天五行
春回大明朝
姑娘不必设防,我是瞎子
甘肃周边
甘肃旅游网
甘肃万维
甘肃张家川
甘肃电力
甘肃民乐
甘肃土豆
甘肃 敦煌
甘肃人事网
甘肃路桥
甘肃机场
甘肃舟曲
甘肃人才
陕西甘肃
甘肃庆城
甘肃建材网
甘肃招聘网
甘肃甘谷
甘肃葡萄酒
甘肃汽车
甘肃花椒
甘肃招聘会
甘肃人口
甘肃竹胶板
甘肃简称
甘肃 兰州
甘肃格尔木
甘肃怎么样
甘肃西安
甘肃几个市
甘肃酒泉市
甘肃银行贷款
甘肃陇南车辆坠江
甘肃省教育考试院
甘肃省教育院
甘肃中医药大学
甘肃省人民医院
甘肃省财政统一缴费平台登录
甘肃特产小吃
甘肃气候特点
甘肃属于哪个省