没有合适的资源?快使用搜索试试~ 我知道了~
首页va-list原理解释
va-list原理解释
需积分: 5 1.6k 浏览量
更新于2023-05-26
评论
收藏 45KB DOC 举报
va_list原理解释,解释了关于VA_LIST的用法、VA_LIST在编译器中的处理、VA_LIST应该注意的问题、以及相关程序
资源详情
资源评论
资源推荐

原理解释:
是在 语言中解决变参问题的一组宏,在头文件下。
VA_LIST 的用法:
()首先在函数里定义一具 型的变量,这个变量是指向参数的指针
()然后用 宏初始化变量刚定义的 变量,这个宏的第二个参数是第
一个可变参数的前一个参数,是一个固定的参数。
()然后用 返回可变的参数, 的第二个参数是你要返回的参数的类型。
()最后用 宏结束可变参数的获取。然后你就可以在函数里使用第二个参数了。
如果函数有多个可变参数的,依次调用 获取各个参数。
在编译器中的处理:
在运行 !"以后, 指向第一个可变参数在堆栈的地址。
()取得类型 的可变参数值,在这步操作中首先 #$%&'( 类型,让 指
向下一个参数的地址。然后返回 )$%&'( 类型的 类型*指针,这正是第一个可变参数在
堆栈里的地址。然后用*取得这个地址的内容。
()!+,- 平台定义为 #.*/,使 不再指向堆栈,而是跟 0 一样,
有些直接定义为"'$*/,这样编译器不会为 产生代码,例如 .. 在 $123 的
+,- 平台就是这样定义的。
要注意的是:由于参数的地址用于 宏,所以参数不能声明为寄存器变量,或作为函
数或数组类型。
使用 应该注意的问题:
()因为 "!"!"&1 等定义成宏!所以它显得很愚蠢!可变参数的类型和个
数完全在该函数中由程序代码控制!它并不能智能地识别不同参数的个数和类型也就是说!你想
实现智能识别可变参数的话是要通过在自己的程序里作判断来实现的
()另外有一个问题!因为编译器对可变参数的函数的原型检查不够严格!对编程查错不利
不利于我们写出高质量的代码。
小结:可变参数的函数原理其实很简单,而 系列是以宏定义来定义的,实现跟堆栈相关。
我们写一个可变函数的 函数时,有利也有弊!所以在不必要的场合,我们无需用到可变参数,
如果在 44里,我们应该利用 44多态性来实现可变参数的功能,尽量避免用 语言的方式
来实现。
"5$ 677声明一个变量来转换参数列表
" !(8677初始化变量
"&1 677结束变量列表!和 " 成对使用
可以根据 " !9 &取出参数
已经经过调试成功的输出程序
:$1.52&$'
:$1.52&


















安全验证
文档复制为VIP权益,开通VIP直接复制

评论0