前言
变长参数,指的是函数参数数量可变,头文件< stdarg.h>包含一组宏,它允许可移植的函数接受变量参数列表被写入。常见的可变参数列表(如printf()),它接受任意数量的参数。本文就来探究一下,可变参数的实现机制是怎样的?以及自己实现一个变长参数函数。
可变参数
stdarg.h头文件为函数提供一个类似的功能,用法比较复杂。必须按如下的步骤进行:
1.提供一个使用省略号的函数原型;
2.在函数定义中创建一个va_list类型的变量;
3.用va_start宏把该变量初始化为一个参数列表;
4.用va_arg宏访问参数列表;
5.用va_end宏完成清理工作;
stdarg.h宏原型如下:
#include <stdarg.h>
void va_start(va_list ap, argN);
void va_copy(va_list dest, va_list src);
type va_arg(va_list ap, type);
void va_end(va_list ap);
接下来分析这些步骤,这种函数的原型应该有一个形参列表,其中至少有一个形参和一个省略号:
void fun1(int n, ...);//有效
void fun2(const char *st,int k, ...);//有效
void fun3(char c,...,int n);//无效
void fun4(...);//无效
可变参数必须要有一个形参,且省略号(…)起着特殊的作用,必须在最右边。
标准中用parmN这个术语来描述该形参。在上面的例子中,fun1()中parmN为n,fun2()中parmN为k。传递给该形参的实际参数是省略号部分代表的参数数量。
fun1(3,10,20,30);//3个额外的参数
fun1(5,10,20,30,40,50);//5个额外的参数
现在让我们按照上面的步骤,来编写一个带有可变数量参数的函数,该函数对可变参数求和:
arg.c
#include <stdio.h>
#include <stdarg.h>//可变参数宏头文件
int sum(int num, ...);
int main(int argc, char const *argv[])
{
int num= 0;
num= sum(5,1,2,3,4,5);
printf("sum = %d\n",num );
return 0;
}
int sum(int num, ...)
{
va_list ap;//定义参数列表变量
int i = 0;
int tot = 0;
va_start(ap,num); //把ap初始化为参数列表
for ( i = 0; i < num; i++)
{
tot += va_arg(ap,int);//传入的参数类型必须与宏参数相匹配
}
va_end(ap);//完成清理工作
return tot;
}
编译结果

传入的参数必须与宏参数的类型匹配,省略号(…)前的参数可以有1个或多个,但前一个必须是确定类型。a_arg的type类型不能是char,short int,float等类型,否则取值可能会出错。
本文深入探讨了变长参数的实现机制,通过分析头文件<stdarg.h>中的宏,详细介绍了如何创建和使用变长参数函数。并通过实例演示了如何对变长参数进行求和操作。
2243

被折叠的 条评论
为什么被折叠?



