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函数,演示了不同输入参数的使用。