c++ 可变参数用法
2011-07-06 02:16
387 查看
头文件
#include <stdarg.h>
使用
设你的函数签名是int sum(int n, ...);
首先获得你的可变参数列表
va_list args; va_start(args,n);
这里args是存储你的变量的指针,n是你的最后一个非可变参数
然后是获得所有参数
int vals ; for(int i=0;i<n;++i) { vals[i]=va_arg(args,int); cout<<"arg "<<i<<" "<<vals[i]<<endl; }
.
ok,结束了。当然你也可以最后加一句
va_end(args);
虽然这句话没有任何程序上的作用。
点评
宏确实是geek玩的东西,这正是c的独到之处。获得可变参数的原理很简单,args获得栈顶指针,根据类型读取相应字节,然后进行反编码返回给变量。这里只摘录最有趣的 va_arg的实现
#define va_arg(list, mode) ((mode *)(list = \ (char *) ((((int)list + (__builtin_alignof(mode)<=4?3:7)) & \ (__builtin_alignof(mode)<=4?-4:-8))+sizeof(mode))))[-1]
c果然余存着汇编的风韵,c#和java里是很难看到这种用法咯。
当然,这种用法的局限也是很明显的,也是不可克服的:我们得知道到底有几个参数,虽然这里的名字叫可变参数。
通常的方法有两种,第一种是像前面那样,直接指明可变参数的个数,printf和scanf也是如此,通过%来指明;第二种方法就是在可变参数的最后加个监视哨,类似于 '\0'
.
另外插个题外话,正是因为这种用法,所以scanf是有可能让你死机的呦~
相关文章推荐
- 关于C的变长参数的思考心得/C/C++语言中可变参数的用法
- c++可变参数用法
- C++...三个点用法 实现参数个数可变的函数
- C/C++语言中可变参数的用法
- C++ template的一些高级用法(元编码,可变参数,仿函数,using使用方法,. C++ 智能指针)
- C/C++语言中可变参数的用法
- C++ template的一些高级用法(元编码,可变参数,仿函数,using使用方法,. C++ 智能指针)
- C/C++语言中可变参数的用法
- C++可变参数函数( 如:void Func(int a, int b, ...) )用法
- C/C++中可变参数的用法详细解析
- C语言中可变参数的用法——va_list、va_start、va_arg、va_end参数定义
- C语言中可变参数的用法
- 【转】C,C++中使用可变参数
- C/C++语言可变参数表深层探索
- C/C++中可变参数的原理
- [C/C++]函数参数的入栈顺序与可变…
- [c++][zz]透析C语言可变参数问题
- C语言中可变参数的用法
- C/C++宏定义的可变参数
- c++中参数传递的三种方式,以及用法。传值,传址,传引用