Vintion's blog

~夜黑路滑,社会复杂~

可变参数函数怎么搞?

| Comments

C语言中的可变参数函数

可变参数函数,比如printf(),这个常用而没深入研究的函数,发现学问很大.

原理

函数的参数入栈顺序是从右到左,这样,第一个参数就在最上面,我们只需要知道第一个参数的地址和后面所有参数的类型就可以确定这些参数的地址了,这样,可变参数函数就需要第一个参数的地址,其余部分就用…来表示 
如: fun(int a, ...) …前面的参数必须存在

标准宏

在stdarg.h头文件中有可用的宏来实现可变参数函数 //可变参数标准宏头文件

include “stdarg.h”

//申明va_list数据类型变量pvar,该变量访问变长参数列表中的参数。

va_list pvar;

//宏va_start初始化变长参数列表。pvar是va_list型变量,记载列表中的参数信息。 //parmN是省略号”…“前的一个参数名,va_start根据此参数,判断参数列表的起始位置。 va_start(pvar, parmN);

//获取变长参数列表中参数的值。pvar是va_list型变量,type为参数值的类型,也是宏va_arg返回数值的类型。 //宏va_arg执行完毕后自动更改对象pvar,将其指向下一个参数。 va_arg(pvar, type);

//关闭本次对变长参数列表的访问。 va_end(pvar);

实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdarg.h>
#include <iosteam>
using namespace std;

int sum(int count, ...)
{
  int sum_value=0;

  va_list args;
  va_start(args,count);
  while(count--)
  {
      sum_value+=va_arg(args,int);
  }
  va_end(args);

  return sum_value;
}

int main()
{
  cout<<sum(5,1,2,3,4,5);//输出15
    return 0;
}

Comments