可变参数函数的基本原理及使用实现
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中我们可以使用如下形式调用动态参数列表,而不需要每次指定参数类型
函数va_start必须同该函数成对出现,类似与malloc和free
va_copy( aq, ap )
该函数相当于对动态参数列表进行拷贝,C99以上版本支持
简单使用方法如下
可变参数函数常用的几个基本函数
#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;
}测试结果如下
相关文章推荐
- Matlab中使用varargin来实现参数可变的函数
- 使用可变参数,实现函数,求函数参数的平均值和最大值
- 使用varargs.h/stdarg.h 实现可变参数函数
- 使用可变参数,实现函数,求函数参数的平均值
- 使用未公开关键字在 C# 中导入外部 printf 等参数数量可变函数 [2] C# 实现
- 使用可变参数,实现函数,求函数参数的最大值
- 使用可变参数,实现函数,求函数参数的平均值
- 使用可变参数,实现函数,求函数参数的最大值
- Matlab中使用varargin来实现参数可变的函数
- 浅谈可变参数函数实现基本原理
- 可变参数函数printf的实现(不使用va_list等内置宏定义)
- 使用未公开关键字在 C# 中导入外部 printf 等参数数量可变函数 [2] C# 实现
- Matlab中使用varargin来实现参数可变的函数
- Matlab中使用varargin来实现参数可变的函数
- 【转】Matlab中使用varargin来实现参数可变的函数
- C使用 stdarg 宏来实现函数的可变参数列表
- OC可变参数的函数实现va_start、va_end、va_list的使用
- C语言可变参数函数的实现
- 如何实现VBA中函数的可变参数传递
- 从printf谈可变参数函数的实现--------作者:戎亚新