可变参数函数的定义:
可变参数函数又称参数个数可变函数(本文也简称变参函数),即函数参数数目可变。其中,参数可分为两部分:数目确定的固定参数和数目可变的可选参数。函数至少需要一个固定参数,其声明与普通函数参数相同;可选参数由于数目不定(0个或以上),声明时用"…"表示(“…”用作参数占位符)。固定参数和可选参数共同构成可变参数函数的参数列表。
可变参数函数的原型:
type VarArgFunc(type FixedArg1, type FixedArg2, …);
关于变参函数几个重要的宏定义:
1、typedef char *va_list;把char *类型的指针,重命名为va_list
2、va_start宏,获取可变参数列表的第一个参数的地址(list是类型为va_list的指针,param1是可变参数最左边的参数(也就是最后一个固定参数))
#define va_start(list,param1) ( list = (va_list)¶m1+ sizeof(param1) )
3、va_arg宏,获取可变参数的当前参数和返回指定类型,并将指针指向下一参数(返回左移的值 [-1] (数组下标表示偏移量),即当前变参值)(type参数描述了当前参数的类型):
#define va_arg(list,type) ( (type *) ( list += sizeof(type) ) )[-1]
4、va_end宏,清空va_list可变参数列表:
#define va_end(list) ( list = (va_list)0 )
总结:va_list定义指针类型,va_start使指针指向第一个可变参数,va_arg获取当前参数,并将指针指向下一个参数,va_end清空指针,是指针不再指向有效的内存。
变参函数实现原理:
#include <stdarg.h>
int VarArgFunc(int dwFixedArg, ...)
{
va_list pArgs = NULL; //定义va_list类型的指针pArgs并初始化,用于存储参数地址
va_start(pArgs, dwFixedArg); //使其指向第一个可变参数。该宏第二个参数是最后一个固定参数
int dwVarArg = va_arg(pArgs, int); //返回变参列表中的当前变参值并使pArgs指向列表中的下个变参。该宏第二个参数是要返回的当前变参类型
//若函数有多个可变参数,则依次调用va_arg宏获取各个变参
va_end(pArgs); //将指针pArgs置为无效,结束变参的获取
}
变参函数使用代码举例:
eg1:函数接受一个整型固定参数和一个整型可变参数,并打印这两个参数值。
void IntegerVarArgFunc(int i, ...){
va_list pArgs = NULL;
va_start(pArgs, i);
int j = va_arg(pArgs, int);
va_end(pArgs);
printf("i=%d, j=%d\n", i, j);
}
分别采用以下三种方法调用
1) IntegerVarArgFunc(1);
输出i=1, j=6803972(形参i的堆栈上方内容
2) Inte