C语言的可变参数一点研究
2010-12-30 09:03
176 查看
可变参数对我多少有点诱惑,当初一开始学习C的时候,就被它迷惑了,我自己写的函数都是定参的,当时以我的功力,断是费上三天三夜功夫也搞不定可变参数。
在汇编的课开完之后,其实对c的一些技巧已经不稀奇了,C毕竟是C,而不像C++有太多的语法规定和编译器规定。
昨天头热,想再来看看这个变参,也许可以偶尔在工作上用一下。
参数是靠堆栈来保存的,其实看看堆栈就知道怎么来获取的了,那获取变参应该就简单了:1.在堆栈中获取数据2.将这些数据转换成参数的值。
加之C中已经有人做了这么几个宏:
代码
断点到f函数被调用那行,转到汇编下,可看到参数的入栈顺序,当然这里的调用约定是__cdecl,慢慢压栈,观察栈的变化,然后在跟踪进f看参数怎么出栈的。
其实一般可变参数不需要栈的,但是如果一个函数连一个定参都没有的话,那就不行的了va_的几个宏只能是根据最后一个定参的地址确定其他的地址的,如果没有一个定参,那么这几个宏,将无用武之地了,这个时候,可以直接在f中获取寄存器的esp即可,当然这样的函数也可能没有多大意义,而且可以被随意加个参数替代。
在汇编的课开完之后,其实对c的一些技巧已经不稀奇了,C毕竟是C,而不像C++有太多的语法规定和编译器规定。
昨天头热,想再来看看这个变参,也许可以偶尔在工作上用一下。
参数是靠堆栈来保存的,其实看看堆栈就知道怎么来获取的了,那获取变参应该就简单了:1.在堆栈中获取数据2.将这些数据转换成参数的值。
加之C中已经有人做了这么几个宏:
代码
#include "stdafx.h" #include <stdarg.h> void f(int n,...) { va_list arglist; va_start(arglist,n); int nArg = va_arg(arglist,int); va_end(arglist); } int _tmain(int argc, _TCHAR* argv[]) { f(1,1,0x2); }
断点到f函数被调用那行,转到汇编下,可看到参数的入栈顺序,当然这里的调用约定是__cdecl,慢慢压栈,观察栈的变化,然后在跟踪进f看参数怎么出栈的。
其实一般可变参数不需要栈的,但是如果一个函数连一个定参都没有的话,那就不行的了va_的几个宏只能是根据最后一个定参的地址确定其他的地址的,如果没有一个定参,那么这几个宏,将无用武之地了,这个时候,可以直接在f中获取寄存器的esp即可,当然这样的函数也可能没有多大意义,而且可以被随意加个参数替代。
相关文章推荐
- 关于C语言可变参数函数的一些研究和总结
- C语言可变参数研究
- C语言“可变参数”的研究
- c语言中关于可变参数的研究
- C语言宏定义的可变参数研究
- C语言中可变参数的用法
- [C语言]利用可变参数列表求平均值。
- C语言中可变参数的用法
- C语言中如何使用宏 包括单双井号 可变参数
- C语言中的可变参数函数 三个点“…”
- 主题六 函数(C语言核心)----34.可变参数列表
- C语言可变参数函数的编写
- C语言可变参数va_list
- C中的可变参数研究
- C语言中可变参数的处理va_list
- C语言可变参数函数实现原理
- C语言写参数可变的函数
- C语言可变参数,va_arg、va_list,va_start,va_end,_INTSIZEOF浅析
- C语言中的可变参数函数 三个点“…”
- C语言如何编写可变参数函数