6.5.8 变量参数表函数库
C51编译器允许函数的参数个数和类型是可变的,变量参数表函数库便提供了用于函数参数的个数和类型可变的函数。这时参数表的长度和参数的数据类型在定义时是未知的,可使用简略形式(记号为“……”)。C51的变量参数表函数包含在头文件stdarg.h中,其函数原型如下。
typedef char*va_list
void va_start(ap,v)
typedef va_arg(ap,type)
void va_end(ap)
下面分别介绍各个函数的用法。
❑va_list函数用于将va_list定义成指向参数表的指针。
❑va_start函数用于初始化ap参数,其一般在一个可变长度参数表的函数中使用。在使用宏va_arg进行存取前,必须调用函数来初始化可变参数表。
❑va_arg函数用于从ap指向的可变长度参数表中检索type类型的值。对va_arg函数的第一次调用将返回在va_start宏中指定的v参数后的第一个参数。继续调用va_arg函数将返回剩下的后续参数。每一个参数可以只调用一次,而且必须按照参数表中的参数的次序进行。
❑va_end函数用于终止在va_start宏中已被初始化的可变长度参数表的指针ap,并且关闭参数表,结束对可变参数表的访问。
在C51语言中,使用具有可变参数的函数时,首先必须声明一个va_list型指针,用va_start函数将指针指向参数表,用va_arg函数访问表中不同类型的参数,当结束对参数的访问后,用va_end关闭参数表。这里举例讲解这些函数在具体程序中的使用,程序示例如下。
include<stdarg.h>//头文件
include<stdio.h>
int VFunc(char*buf,int id,……)//自定义函数
{
va_list tag;//定义tag为参数表指针
va_start(tag,id);//调用va_start函数
if(id==0)
{
int arg1;
char*arg2;
long arg3;
arg1=va_arg(tag,int);//调用va_arg函数返回参数
arg2=va_arg(tag,char*);
arg3=va_arg(tag,long);
}
else
{
char*arg1;
char*arg2;
long arg3;
arg1=va_arg(tag,char*);//调用va_arg函数返回参数
arg2=va_arg(tag,char*);
arg3=va_arg(tag,long);
}
va_end(tag);//关闭参数表
}
void main(void)
{
char tmp_buffer[10];
VFunc(tmp_buffer,0,19,“Test Code”,200L);//调用函数
VFunc(tmp_buffer,1,“Test”,“Code”,218L);//再次调用,不同的输入参数
}
该程序可以在KeilµVision3编译环境中执行。程序中自定义了可变参数的函数VFunc,其中分别调用变量参数表函数进行操作。在main主函数中,则通过两次调用VFunc函数,演示了不同输入参数的使用。