c++ 可变参数用法

头文件

  
#include < stdarg.h >

使用

设你的函数签名是

  
int sum( int n, ...);

首先获得你的可变参数列表

  
va_list args;
va_start(args,n);

这里args是存储你的变量的指针,n是你的最后一个非可变参数

然后是获得所有参数

  
int vals[n];
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是有可能让你死机的呦~

你可能感兴趣的:(可变参数)