您的位置:首页 > 其它

可变参数函数的基本原理及使用实现

2017-12-20 19:38 351 查看
软件开发过程中,我们最常见的可变参数函数是自定义的日志打印函数,用于程序的调试以及生产维护问题查找的基本依据。这里对该函数做简要的介绍以及基本使用方法。

可变参数函数常用的几个基本函数

#include <stdarg.h>

void va_start(va_list ap, last);

type va_arg(va_list ap, type);

void va_end(va_list ap);

void va_copy(va_list dest, va_list src);

函数说明:

va_start( )

该宏函数用于初始化动态参数列表(ap),用于后续的va_arg( ap, last )和va_end( ap )函数的参数传递,该函数调用必须先于va_arg,va_end函数,last参数指的是最后一个确定类型的参数类型(如果是字符串类型,可以传递字符串首地址)

注意:Because the address of this argument may be used in the va_start() macro, it should not be  declared

       as a register variable, or as a function or an array type

va_varg(
va_list ap, type )

该宏函数用于获取可变参数列表中下一个数据类型和值,每一次调用va_arg函数ap都会指向下一个可变参数,以致在下一次调用改函数的时候能够得到该参数的值,type参数表示通过以type为数据类型获取该参数的值。如果下一个可变参数不存在或者参数类型和type不兼容,会产生不可预见的错误。

在vfprintf中我们可以使用如下形式调用动态参数列表,而不需要每次指定参数类型

vfprintf( ap, fmt );
va_end( va_list ap )

函数va_start必须同该函数成对出现,类似与malloc和free

va_copy( aq, ap )

该函数相当于对动态参数列表进行拷贝,C99以上版本支持

简单使用方法如下

#include "getSum.h"
#include "getReduce.h"
#include <stdarg.h>

void print( char *fmt, ... )
{
va_list valist;
int i = 0;
char c ;
char *p = NULL;

va_start( valist, fmt );
/*      第一种调用方法使用va_arg函数逐个调用
while( *fmt )
{
switch( *fmt++ )
{
case 'd':
i = va_arg( valist, int );
printf( "[%d]\n", i );
break;
case 's':
p = va_arg( valist, char* );
printf( "[%s]\n", p );
break;
case 'c':
c = (char)va_arg( valist, int );
printf( "[%c]\n", c );
break;
}
}
*/
vprintf( fmt, valist); // 第二种调用方法
va_end( valist );

}

int main( int argc, char *argv[])
{
int a = 1;
int b = 2;

int c = 0;

c = getSum( a, b );
printf( "%d + %d = %d\n", a, b, c );
c = getReduce( a, b );
printf( "%d - %d = %d\n", a, b, c );

char s1[5] = "1234";
int  i = 10;
char cc = 'x';
print( "%s, %d, %c, %s\n", s1, i, cc, s1 );
return 0;
}
测试结果如下

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: